{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9867e618",
   "metadata": {},
   "source": [
    "## Recursive SMARTS\n",
    "\n",
    "In this notebook, we'll cover recursive SMARTS, a powerful technique for matching specific chemical features.  In contrast to a standard SMARTS pattern, where each atom in the pattern matches an atom in the target molecule, recursive SMARTS match a **single atom** and its surrounding environment.  As such, recursive SMARTS, are ideal when we want to assign labels to specific atoms.  As we will see below, the flexibility of recursive SMARTS also makes them helpful for several other purposes. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ee76e9afa2762d7",
   "metadata": {},
   "source": [
    "Install the necessary Python libraries"
   ]
  },
  {
   "cell_type": "code",
   "id": "ca045bf8634e3569",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:05.712194Z",
     "start_time": "2025-05-05T16:56:05.709250Z"
    }
   },
   "source": [
    "%%capture\n",
    "import sys\n",
    "IN_COLAB = 'google.colab' in sys.modules\n",
    "if IN_COLAB:\n",
    "    !pip install rdkit"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "id": "e87cdaa5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:05.883822Z",
     "start_time": "2025-05-05T16:56:05.721432Z"
    }
   },
   "source": [
    "from rdkit import Chem\n",
    "from rdkit.Chem.Draw import MolsToGridImage"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "id": "6260d48b",
   "metadata": {},
   "source": [
    "To begin, let's define an example molecule with two different sidechains, a carboxylic acid and an aldehyde. "
   ]
  },
  {
   "cell_type": "code",
   "id": "b28a90e6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.044416Z",
     "start_time": "2025-05-05T16:56:06.037539Z"
    }
   },
   "source": [
    "m1 = Chem.MolFromSmiles(\"OC(=O)c1cccc(C=O)c1\")"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "id": "075ee70e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.053966Z",
     "start_time": "2025-05-05T16:56:06.048170Z"
    }
   },
   "source": [
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "markdown",
   "id": "550358ca",
   "metadata": {},
   "source": [
    "If we define a SMARTS for a carbxoylic acid, the pattern matches 3 heavy (non-hydrogen) atoms.  Remember that hydrogens in a SMARTS are simply specifiers for the attached heavy atom. "
   ]
  },
  {
   "cell_type": "code",
   "id": "2f25b182",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.059600Z",
     "start_time": "2025-05-05T16:56:06.058131Z"
    }
   },
   "source": [
    "simple_acid_smarts = \"C(=O)[OH]\"\n",
    "simple_acid_query = Chem.MolFromSmarts(simple_acid_smarts)"
   ],
   "outputs": [],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "id": "636d5565",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.069001Z",
     "start_time": "2025-05-05T16:56:06.067158Z"
    }
   },
   "source": [
    "m1.GetSubstructMatches(simple_acid_query)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1, 2, 0),)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "id": "fb32e055",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.082759Z",
     "start_time": "2025-05-05T16:56:06.077411Z"
    }
   },
   "source": [
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "id": "c9ad5659",
   "metadata": {},
   "source": [
    "In a recursive SMARTS, the smarts is enclosed by **\\[$()\\]**.  This indicates that only the first atom in the SMARTS should be matched.  Let's change the carboxylic acid SMARTS above to a recursive SMARTS. "
   ]
  },
  {
   "cell_type": "code",
   "id": "78b56703",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.092817Z",
     "start_time": "2025-05-05T16:56:06.091267Z"
    }
   },
   "source": [
    "recursive_acid_smarts = \"[$(C(=O)[OH])]\"\n",
    "recursive_acid_query = Chem.MolFromSmarts(recursive_acid_smarts)"
   ],
   "outputs": [],
   "execution_count": 8
  },
  {
   "cell_type": "markdown",
   "id": "6ee6278e",
   "metadata": {},
   "source": [
    "Note that the recursive SMARTS only matches one atom, the first atom in the pattern. "
   ]
  },
  {
   "cell_type": "code",
   "id": "30be152c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.098846Z",
     "start_time": "2025-05-05T16:56:06.096866Z"
    }
   },
   "source": [
    "m1.GetSubstructMatches(recursive_acid_query)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1,),)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "id": "5e881c64",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.110010Z",
     "start_time": "2025-05-05T16:56:06.105308Z"
    }
   },
   "source": [
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "markdown",
   "id": "3cd1e78c",
   "metadata": {},
   "source": [
    "Let's rewrite the SMARTS and make the carboxylate oxygen the first atom.  Now notice that the matched atom changes. "
   ]
  },
  {
   "cell_type": "code",
   "id": "9a24c4c2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.119376Z",
     "start_time": "2025-05-05T16:56:06.117764Z"
    }
   },
   "source": [
    "rearranged_recursive_smarts = \"[$([OH]C(=O))]\"\n",
    "rearranged_recursive_query = Chem.MolFromSmarts(rearranged_recursive_smarts)"
   ],
   "outputs": [],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "id": "77f53674",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.125806Z",
     "start_time": "2025-05-05T16:56:06.123802Z"
    }
   },
   "source": [
    "m1.GetSubstructMatches(rearranged_recursive_query)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((0,),)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "id": "773810e2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.138843Z",
     "start_time": "2025-05-05T16:56:06.134379Z"
    }
   },
   "source": [
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "markdown",
   "id": "2fe175c1",
   "metadata": {},
   "source": [
    "Recursive SMARTS can also be combined to create more complex queries.  Queries can be combined with **\"&\"** for AND or **\",\"** for OR.   There is also the **\";\"** operator, which represents AND with a lower priority than OR. In the example below, the carbonyl query below two atoms in the target molecule. "
   ]
  },
  {
   "cell_type": "code",
   "id": "8c363076",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.152300Z",
     "start_time": "2025-05-05T16:56:06.147470Z"
    }
   },
   "source": [
    "combo_query = Chem.MolFromSmarts(\"[$(C=O)]\")\n",
    "m1.GetSubstructMatches(combo_query)\n",
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "markdown",
   "id": "fe1847ba",
   "metadata": {},
   "source": [
    "If we modify the recursive SMARTS to add another term with an AND condition **&$(\\[CD3\\])**, the new recursive SMARTS only matches carbonyl groups with 3 connected heavy atoms (degree 3). "
   ]
  },
  {
   "cell_type": "code",
   "id": "78b4f72c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.165727Z",
     "start_time": "2025-05-05T16:56:06.161087Z"
    }
   },
   "source": [
    "combo_query = Chem.MolFromSmarts(\"[$(C=O)&$([CD3])]\")\n",
    "m1.GetSubstructMatches(combo_query)\n",
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "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"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "markdown",
   "id": "af0373d5",
   "metadata": {},
   "source": [
    "Recursive SMARTS can also represent a NOT condition by specifying a **\"!\"** operator.  If we modify the recursive SMARTS above and chage the second part to **&!$(\\[CD3\\])**, the SMARTS matches carbonyl groups that **do not** have 3 connected heavy atoms. "
   ]
  },
  {
   "cell_type": "code",
   "id": "772c7dc2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.178751Z",
     "start_time": "2025-05-05T16:56:06.173866Z"
    }
   },
   "source": [
    "not_query = Chem.MolFromSmarts('[$(C=O)&!$([CD3])]')\n",
    "m1.GetSubstructMatches(not_query)\n",
    "m1"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x369302dc0>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAZuElEQVR4nO3dfVhUZd4H8O8MM6AIKkIqgu8IKqIJq4RJoGG2yfp0reJLibs9u6KZoM9ea2SPORWlU1g7mbSNWV5cblsPtHUFpRm4Cr4mYSqGMaiLyJsIqCAvwzBzP38cHXFmQAg4Z+ac3+fyD68z95n5HY/zPfc993mRMcZACCHk15ILXQAhhDg2ilFCCOkRilFCCOkRilFCCOkRilFCCOkRilEiZvv379+5c2dJSYnQhRAxk9EJT0SUGhsb586de+rUKQAymWzFihW7du3q16+f0HUREaLeKBEbxtinn37q5+fHZaiLiwtjbO/evYGBgWlpadRvIL2OYpSIik6nmz9//ooVK6qqqsLCwtLT01taWj788MNp06Zdvnx56dKloaGhOTk5QpdJxIURIgqNjY0qlcrZ2RnAkCFDNBqN0Wg0v2o0GlNTU0eMGMH9t4+KiiooKBCwWiImFKNEDDIyMkaNGgVALpfHxsZev37dZrPGxka1Wj1w4EAACoUiLi6usrKS51KJ+FCMEsdWXFz85JNPcn3M4ODgkydPPnCV69evJyQkKBQKAAMGDEhMTKyvr+ehVCJWFKPEUTU1NalUKhcXFwAeHh4ajaatra3rq//yyy8xMTFc/o4YMUKr1XZrdULMKEaJQ8rIyBgzZgwAmUwWGxtbXV3dUcvPPvssKirq9OnTNl89fvz4o48+yoXppEmTuKl8QrqFYpQ4mEuXLi1YsIALvocffvj48eOdtw8JCeF+M/3jH/949epV6wYmkyktLW38+PHcez7++OMdZS4hNlGMEoeh1+vVajV3Cv3gwYO7OIqvra1NTEzk1urfv39iYuLNmzetm7W2tmq12oceeojr4cbExFy+fLkPNoKIEMUocQzZ2dkTJ040j+Krqqq6tfqVK1diY2NlMhkAT09PtVrd0tJi3ayurs6cuc7OzgkJCTdu3OilLSCiRTFK7F1ZWVlsbCw34p46deqRI0d+9VudOnUqIiKCeyt/f/+0tDSTyWTdrLS0NC4uTi6Xc6egdpS5hHAoRon9am1t1Wg0bm5u3JlJKpVKr9f3/G2zsrKmTJnChWloaGhubq7NZnl5eZGRkVyzCRMmdJS5hFCMEjt16NChyZMncykWHR1dWlrai29uMBi0Wu3w4cPN719cXGyzZVZWVlBQENds5syZHWUukTKKUWJ3KioqzKN4f3//AwcO9NEH3b59W61Wu7u7A1AqlXFxcdeuXbNuxl1I2j5zdTpdH5VEHBHFKLEjBoNBo9FwF2u6urqqVCoefpQsLy+Pi4tzcnIC4ObmplKpmpqarJtZZ253p7mIWFGMEnuRk5Nj/skyOjq6pKSEz08vLCw0X9Tk6+vb0UVNXcxcIikUo0R4lZWV5rOR/Pz89u3bJ1Ql2dnZ06dP58I0MDDw22+/tdmsi5lLJIJilAjJaDRqtdpBgwZx58arVKrm5mZhS+Iuaho7dqz5lnpnzpyx2TI7Ozs4ONicud988w3PpRI7QTFKBJOXlzdjxgzzKN6urhrS6/UajYbLd+7me+Xl5dbNLDLXy8srPT2d/2qJsChGiQCKioqWLVvGnd/u6+trt9FTU1OTmJjI3UTK1dU1MTHx1q1b1s2amprUarVSqeQussrJyeG/VCIgilHCtzfeeIP7GbRfv35btmyx/ykanU4XExPD1ezl5aXRaAwGg3WzoqIirvc6Z84c/oskAqIYJXzr378/d5GlY53K/sMPP4SHh3OD94CAAJu31Hv88ccBzJ49m//yiIDokXaEb83NzQAuXrxoTiWHMHPmzJycnPT0dD8/v6KioiVLlkRGRp4+fbp9m9mzZwMIDQ0VqEYiDIpRwjfuqXNGo1HoQrpNJpMtXry4sLBQq9UOGzYsJydHp9O1b8BdOMDoGc4SQzFK+MbdaoSbX3JE3CVMRUVFGo1m6dKlFi8BMBgMApVGhOGo/5WJ47LOmhdffFEmkyUnJwtXVLcNGjRo/fr13LyTGbdpra2tAhVFhEExSvhmHaOi6cRxv1eIYENIt1CMEr6JOEZFsyGkWyhGCd+sR76iSR/RbAjpFopRwjfrka9o0kc0G0K6hWKU8I0G9URkKEYJ3zqKURFMcItmQ0i3UIwSvlnHqGgmuEWzIaRbKEYJ32hQT0SGYpTwjWbqichQjBK+0Uw9ERmKUcI3GtQTkaEYJXyjmXoiMhSjhG8inqmn3qg0UYwSvol4UC+a4wHpFopRwjeaqSciQzFK+EYz9URkKEYJ30Q8qBfNhpBuoRglfBP9TD3FqNRQjBK+ib43KoLjAekWilHCN9Gf8NTW1kYPB5UUilHCNxH3RmUymUKhYIw54uOjya9GMUr4JuITniCubSFdRDFK+Cbi3ijEtS2kiyhGCd9EfN4oaJZJkihGCd9EfMITRDRdRrqOYpTwTcQz9RBXz5p0EcUo4Zt10CgUCplMJo7zhChGJYhilPDNZtAoFAoAbW1twtTUeyhGJYhilPDN5i+hokkf0WwI6TqKUcI3m7+EimaWSTQbQrqOYpTwzWZ/TTSzTKLZENJ1FKOEbzZjVDRjYdFsCOk6ilHCN3HEqMFgeO+991asWGGx3OE2hPQcxShf1q7Fnj2WC0tKsGYNcnPvW3jtGrZvx/LleOop/OEP+PhjNDfzViYPRBCj2dnZQUFBGzZs+PTTT/Pz89u/5FgbQnoFxShftFocPGi58No1aLU4f/7ekowM+PnhlVdQV4eBA1FcjFWrMGkSfv6Zz2L7lM1JmPz8/Lq6urFjxwpUVFdVVlauXLly3rx5RUVFEyZMOHDgQEhISPsGFKMSpBC6ANLOhQtYtgz+/sjMxMiRdxYePYqFC7FwIc6dw4ABgtbXO2xOwgwcOFCgcrqqra0tJSVly5Yt9fX1rq6uGzdu3LRpk4uLi0Wz+vp6AKWlpULUSIRBvVF7olZDr8fnn9/LUACzZyM5GZcvIzVVuMp6kyP213Jzc4ODgzds2FBfXx8dHV1YWPjqq69aZGhFRcXKlStzc3O9vb3Xr1+/evXq6upqoQomfKIYtRuMYf9+TJuGiRMtX1q+HHI59u8XoqxeZjAYPv/884EDB5aXl+/atcv+b29cVVW1cuXKyMjIgoICPz+/ffv2ZWZmjh49un0bg8Gwffv2gICAvXv3urm5jRkzxmQy7dq1KyAgIDk5uaWlRajiCU8Y4YdczqZNY0lJ9/1ZvZoBLCWFMcZqaxnAFi2yvbq3N/P357PevpCdnR0QEABAJpNx//2mTZt24MABoeuyzWg0pqamenp6Aujfv79KpWpubrZulpOTM2XKFG5zoqOjS0pKGGOFhYUxMTHcQl9fX61Wy90xgIgSxShf5HI2YAAbPfq+P97e92K0rIwBbNUq26sHBTEfHz7r7V0VFRWxsbFcek6YMGH//v1paWnjxo3jgiYqKuqnn34Susb75OXlzZgxwxyOly9ftm5TWVlp3iiuo2rRICsra/r06dybhISEHDx4kJfaCd8oRvkil7Nnn7VcePLkvRhtaGAAi462vbqXFwsM7NsK+4bBYNBoNNwMkqurq0qlamlp4V7S6/UajWbw4MEA5HJ5TEzMf/7zH0GLZYyx2trahIQEuVzOdSTT09Ot2xiNRq1WO2jQoM47qlzLtLS0MWPGmA8YZ8+e7eMtIHyjGOXLA2OUMTZmjO2R+/XrDGDLlvVthX0gNzc3KCjIYsBroba2NjExkZuucXV1TUxMvHnzJv+lMsZMJlNqaqqXlxcApVKZkJDQ0NBg3awrHVULTU1NarWai125XB4bG1tRUdEHW0CEQTHKl67E6P/8DwNYbq5ls61bGcC4btF337H0dGYy9XG5PdV+wDt+/Phvv/228/ZXrlwxt/f09FSr1Xq9np9SOadPn37kkUe4cJw7d25hYaF1m/Yd1XHjxmVmZnbrI2pqaiwOGLdu3eql8omQKEb50pUYraxkXl7M15edOHFnicnE9u5lLi4sLIy1tTG9nk2YwAA2cybLyeGv+O7o4syMTadOnYqIiOCyzN/fPy0tzdT3B4wbN24kJCQ4OTkBGDFiRGpqqnUbbqPad1Rv37796z5Op9PFxMRwBwwvLy+NRmMwGHq2BURgFKN86UqMMsby89nYsQxgEyawWbPuzEFFRrLqasYYMxpZauqdhQCLimLnz/O3CV3w448/zpw5s1sDXmtZWVnmue/Q0NAjR470ep0cbhQ/dOhQczjW19dbN8vPz2/fUb1w4ULPP/rkyZPh4eHcewYEBKSlpfX8PYlQKEb5kpLCvv/ecmFVFXv/fVZQcN/Clhb2xRcsMZGtWcNUKnb4sOVat28ztZq5uzOAKZUsLo5VVfVh5V1jMTPTw1wwGAxarXb48OHmRC4uLu6tUjlnzpx59NFHufePiIg4b+uAVFdXZ+6o+vj42Oyo9kRGRoafnx9XQ1hY2LFjx3r3/Qk/KEYdVnU1S0hgCgUDmJsbU6lYU5MghXRxZuZXuH37tlqtdnd35945Li7u2rVrPX/bmzdvJiQkcI8t8fb2Tk1Ntf7poIsd1Z5rbW3VarXcB8lkspiYmEuXLvXFB5G+QzHq4C5cYDExd8b4Pj5Mq2X8nubdlZmZHiorK4uLi+O6hG5ubt36sdVaRkaGr68vAIVCkZCQYHOS58yZM7NmzeI2KjIy0mZHtXc1NDSoVKr+/fsDcHZ2jouLq+Z+xnmg5mZWV8d68A9Ceo5iVBQOHmTBwXfCdPJk1s0Z5F+nKzMzvajn1wUVFRXNmzePe4fw8PBz585Zt+E6qtxGddRR7TtXr141HzA8PDzUanWHB4yqKvbll0ytZklJbNs2lpTE1Gr25ZesspK3aokZxahYmEwsLe3O9BQ3+9Rn1wXxNuC1ZnFd0L///e+urNXY2KhSqbg7S3l6emq1WpvhmJaWNmzYsM47qjw4f/78ggULuG0cNWqUVqs1Go33XjYY2FdfsTffZK+9xl599b4/r73G3nyTffUVa20VpHLJkjHHfzI4uaelBTt2YNs23LwJJ6e6559vfuklHx+fXvyEs2fPvvDCC8eOHQMQERGRkpISGBjYi+//QCaT6V//+teLL75YUlICICoq6p133pk6dWonq+zevXvVqlVOTk7PP/98UlISd91Ue0VFRevWrcvOzgYQHh6ekpJivmpAKNnZ2X/961/Pnj0L4De/+U1ycnJkZCT0euzZg9padPIkaqUSQ4bguedgdRM/0kcoRsWorg5vvw2NJj409JMff4yPj9+0aRN3CU1P3Lp1a8uWLR988EFbW5u3t7darTafMM+/5ubmHTt2bNu27datW3K5/Nlnn33rrbe8vb1tNjYajWvWrFm7dq25J2vW2NiYnJy8bdu21tZWT0/PrVu3rlq1SqiNssAdMDZu3HjlyhUAUVFR786ZE8QYDAZ0UiFjUCgwahRiYztrRnoPxahosUuXYl955Z+ff84YGzZsmEqlWrVqFTc9/StkZmauXbu2rKxMoVCsXbs2KSnJHm60XFtbm5ycrNFo9Hq9q6trfHz8yy+/3PXCMjMz161bV1paygXx3/72N+6qAbvS1NT0/vvvb926tb6+XiGX//f06a/NmTPcze0BqymViI5Gp5100lsoRkUuLy9v48aNOTk5APz9/d94443Fixd3q7el0+nWrVuXlZUFuxnwWtDpdJs3b/7iiy8YY15eXps3b37hhRc6P2AUFxfHx8cfOHAAQEhIyAcffGC+asA+1dTUJC1a9MHRo20m0wBn53UzZ/5veLh758P2QYOwYQNfBUoa3bZZ5GbMmHH48GHuuiCdTrdkyZJZs2YdPXq0K+s2NTW9+uqrQUFBWVlZnp6eGo3m8OHD9pahuHvZ6IkTJ8LDw2tqajZs2BAUFJSenm6zsXmjDhw4MGTIEI1Gc+rUKTvPUABewHtPPnl+7dqYwMDG1ta3jh6duHPnrvx8o8lkewXG0NSE69f5LVOiqDcqFW1tbZ988olKpaqqqgIQHR2t0WjGjx/fUXuHGPBay8zM/Mtf/nLx4kUAYWFh27dvN58Byr2akJBQUlIik8lWrFjxzjvvPPTQQ8IV2x1nz2LfPrS2AjhZVvbX778/VloKwEWhWDtjxrvz59tYxdkZv/0tHn6Y50oliGJUWhobG3fu3Pnmm282NDQolcrnnnsuKSmJO3XJ7OLFi/Hx8d999x0cZMBrwWAw7Nmz55VXXqmurpbJZBEREa+//npra+umTZvy8vIATJ8+PSUlJSwsTOhKu+PoURw6hLt9T8bYF4WFf8rIaNDrAfzf4sVL7t6F4B6ZDHPm4O6V+6TvUIxKUXl5+euvv/7xxx8bjUYPD4/ExMT169f369evvr5++/btb7/9tl6v9/DwUKlU8fHx3GXyDufmzZvbtm3bsWNH+0chDR48eOvWratXr3a8jTp+HAcP4v4hfL1eH/zhh5du3PhdQEDG8uWWq8jlmDsXd+8bQPoOxah0nTt3bsGCBWVlZQBGjx7t7+9/6NChtrY2ACNHjvzpp58cYhTfuYKCgkWLFhUXF+PubU+5h0E5ngsX8PXX0OstFr919OhL2dmJs2ero6IsV3FxwcKFmDyZpwoljJ5TL11Tp06dM2fO3r17R48efeXKFe7kRHd394aGhoCAABFkKICgoCCdTldQUMD9XehyemDUKNh6iqrSyQlAq80HrBqNGDWqr+sioBiVOO6R8Zs3by4sLDx9+rS3t/ef//znqKgox3qI/AM5doByBgyAj8/Bw4frmprmjh3r6erKLXZ2cgJgsI5RmQw+Pnjg6aWkN1CMShp3mXlbW9u7777LLTl+/DgAkcWoSMyfv0WlOl5aeuxPf5p1N0aVcjkAg/VpTwoFnniC5wIly9F+aCe9iuuNtg9N6yXEXnh7Kz08cP8QXmmzN6pUIiwMI0bwW590UYxKWkcx2traKlhNpGPOQ4cCMLS7CM1Gb1SpRHAwIiP5Lk7CaFAvadQbdSx39k5oKOrrYTRCr7+vN+rsDIUCCxbQ7DzPKEYlzTo0uV9LKUbt0539NXw4Vq1CUREKC5VlZQBaFQpMmYLJkxEQAIc7JdbxUYxKGvVGHcu9vSOXY9IkTJqkVCqxe7dh5EgsWiR0ddJFBy5Joxh1LDR6sE8Uo5JGMepYrCcAaX/ZA4pRSaOvpWOhw559ohiVNPpaOhbrITztL3tAMSpp9LV0LHTYs08Uo5JGp987Ftpf9oliVNKsv5ZyudzJyYkxZrR50yAiKJqpt0903qik2RwSKpVKo9FoMBicnJwEqovY9szQof8VEeHev795yUil8mpYmNHLS8CqCMWopHUUoy0tLQaDoV+/fgLVRWwLun0bOTl47DHzEjel0u3ECYweLWBVhGJU0oIHDDgZETHQ27v9wvOhoS719f3o5zY7pFQCQPtdwy2hQb2gKEYlbRRjo3Jy4Ox838KCAly7hrY2oaoiHbIOTYpRO0BTTNJm80to3eUhdoI74FGM2hmKUWmz/lqCvpl2rKPeKB3zBEUxKm02E9NmthJ7YL2/aGfZAYpRaetkUE/fTDtkvWsUCgBoawM9KV04FKPSRjHqWKx3jUwGhQKM2Xz8MuEHxai02fxljWLUbtH+sksUo9JGvVHH0smUIM0yCYdiVNroa+lYaErQLlGMSht9LR0LjR7sEsWotNHX0rHQ/rJLFKPSRl9Lx0L7yy5RjEobzfw6FtpfdoliVNqod+NYaH/ZJbrDk7Q5OUEuh8kEkwnyu8dUmqm3W/36wcMD7W7bDADTpsHZ+c7lTEQI9E8veUol9HoYDHBxubOEZurt1sSJqKuzXLh3rxClkHsoRiXPOkZpkGjnfv4Zn32GwkK0tsLHB089hd/97t5ggvCO/uklb8oUhITAZLq3JDAQCxdizBjBSiKdSErC1Kn48EOYTHB3x5EjePppREba6KUSvsgY3RiGEEfx2Wd45hksXYqPP8aAAXcW7t6N1asRHY2vvxa0OOmiGCXAL79Aq0VeHhob4eGBxx7D889j2DChyyL3YwwTJ6KxEcXFlrNMcXH46CPk5yM4WKDiJI0G9ZK3Zw+CgvCPf8DPD/PnY8gQvP02AgKQmyt0ZeR+ly5Bp8PChZYZCuCZZwBg3z7+iyKgKSapy89HXBweeQTffINBg+4svHgRc+di8WIUFoIegG4/dDoAGDvWxkvjxgFAcTGv9ZC7qDcqbdu3gzHs3XsvQwH4+WHHDly/jt27hauMWGluBgBPTxsvcUe7xkZe6yF3UYxKGGPIysLUqTYm5aOj4eyMrCwBqiId4Q51FRU2XuIWDh7Maz3kLopRCbt1C7W1tk9sUijg64vLl/kuiXRiyhSgg5F7UREABAXxWg+5i2JUwrjLPd3dbb86eDBaWvgshzzA8OGYNQtff43r1y1f2rULTk54+mkhyiIUo1I2aBDkcpSX23716lXbP8MRAW3bhoYGPP00SkruLGlpwUsvISMD69Zh9Ggha5MwmqmXMBcXTJqEX34BY5DJ7nupuho1NXjiCYEqIx147DH8859YswbjxyMwEG5uOH8et29jzRokJwtdnHRRb1TalixBeTm++spy+Y4dYAzLlglRE+nU0qW4dAm7d2PePISEYPNmnD+Pv//9zp0QiBDoKiZpq6/H9OmoqcFHH+H3v4dCgaYm7NyJl19GVBT277fspRJCrFCMSt6VK1i+HCdOwNUVQ4eiogIGA5YuxUcfwc1N6OIIcQAUowRgDD/+iB9+QGMjhgxBZCQmTBC6JkIcBsUoIYT0CE0xEUJIj1CMEkJIj1CMEkJIj1CMEkJIj1CMEkJIj1CMEkJIj/w/R5zpklIOQ80AAAEAelRYdHJka2l0UEtMIHJka2l0IDIwMjQuMDkuNgAAeJx7v2/tPQYgEABiJgYI4IbiBkYOhgwgzczIyMagAWKwcEBoJjYHCJ/NAayAmREbA6qEASqA0AsV4GZgVGBk0mBiZFZgZslgYmFNYGXLYGJjT2DnUODg1GBi58pg4mJOcGIEKmdj5mJnY2UR7wOyGRlgDv16L+lAi06rLYhTf4LvwKt5GvtB7Ks3eQ4cUOI6AGKfaSra3+L6Aaym2LZqf/Kvc/YgdvXhOXYS6pIOIPap2PP2n1dfBYvLWV+2d1qvawdis26xdVh1gxds5rpF9g4GhcxgM8XW7bY7ZS0NFhcDADepOHGCWk8IAAABS3pUWHRNT0wgcmRraXQgMjAyNC4wOS42AAB4nH2SS07EMAyG9z2FLzCRHT+SLOclhNC0EgzcgT33F3aHIR0REcdVkn517N+dIMbr6eXzC35HPk0TAP4zW2vwwYg4XSAWcDg/Pc9wvO4P95Pj8j5f34AoJoY9svvrcrmfECyw46QiVStgQlPMFot19E8zHGGXU2ZstcAOk2m1ogOSI6STiKVZrEgrFxqQEjExNSmMcTlR4YwDUH/AUtSPKRkVpFGW5iAmRgca5MSNkUY3F+c8jOeoazxrTKOL641zTSRHgtaMZMA153JqJkQ5MlUVdJn+gn7LEmQTRglxULlUHpF0q8VMjVfB0biOijnPp4ee3rp8WOZT73JY7r0M494wfwfSuxKmXXvfgHWFxb10IcW9dr3IvXVZsjttq5dgaFOkrI9tLdvMY3//t309fQNdvpmWgsoD0wAAAK56VFh0U01JTEVTIHJka2l0IDIwMjQuMDkuNgAAeJwljssNhDAMBVvZI0jG8j+xIk4UQBFpg+Ix2ZOtp/E83+c1ec7t2s57v/c5J/+eTTDTFA5Bcm0dRgVhzHAQuhv1BoMxnMSAkCODDQahRnjoRwWFdoZRa1pT6h/HTaUiQVHKXJj3aP7PqKCa7F1Lfyi6WY+6o6+otEvWCq9qbiSrkWpNENRU4vVViRYSqQz78wIrEy5pkOENqAAAAABJRU5ErkJggg=="
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "markdown",
   "id": "019a5223",
   "metadata": {},
   "source": [
    "Recursive SMARTS also provide a convenient means of handling cases where multiple possibilities exist.  As an example consider nitro groups. Show below are three different ways of representing a nitro group.  Let's say we're designing a functional group filter and we want to be able to catch any of the three representations below.  First let's create three versions of nitrobenzene with different nitro representations. "
   ]
  },
  {
   "cell_type": "code",
   "id": "12e948de",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.193876Z",
     "start_time": "2025-05-05T16:56:06.186758Z"
    }
   },
   "source": [
    "nitro_smi_list = [\"c1ccccc1N(=O)(=O)\",\"c1ccccc1[N+2]([O-])([O-])\",\"c1ccccc1[N+](=O)([O-])\"]\n",
    "# In the following line, \"sanitize = False\" is used to prevent RDKit from altering the nitro groups while parsing the molecule. This allows the three different representations of the nitro group to be preserved and shown. However, the example also works without disabling sanitization.\n",
    "nitro_mol_list = [Chem.MolFromSmiles(x, sanitize = False) for x in nitro_smi_list]\n",
    "MolsToGridImage(nitro_mol_list)"
   ],
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAADICAIAAAC7/QjhAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd3wU5dYH8N+WFAKBJPROChAIPfdiCSIgVUSkyRULcpEiIKEjRQVEUIEQiiD6KkUUpEUNTSLqVS5cAUMLoiSAhppAAiGkZ/e8f0xcspPdJCS7+8xkzvfDH/o8mDnqYc7MM0/REREYY4wxrdKLDoAxxhgTiQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTeNCyBhjTNO4EDLGGNM0LoSMMcY0jQshY4wxTTOKDoApUmoqzpzB7dvw9UXr1vDzEx0QU7M//8T588jORq1aaN8eHh6iA2IVguPyigshs3bpEiZPxu7dMJkKWgwG9O2LiAgEBgqNjKlQTAymT8epU/dbKlfG2LFYsABeXuLCYirn6LzSEZHDgmNqd/48OndGcjL+9S8MGYK6dXH9OrZvx9atqFEDP/2E4GDRITL12LIFL74ILy+MH49u3VC5Ms6fx5o1OHYMYWE4eLDgET41Fffu3f+nGjUSFS9TB2fkFTFm8fDDBNCHH8rbP/iAAOrYUURMTJ2uXKEqVcjbm06ftmrPy6OBAwmgN94oaJk0ierXv/+LsWI4J6/4jZD97cgRPPooHnsMP/1ko/exx3DoEH7+GZ06uTwypkLz5mH+fLzzDmbPlnelpKBhQ1SqhGvX+HshezDOySueNcr+9t13ADB4sO3eoUPv/x7GSiSlyqBBNrqqV8cTTyA1FbGxLg6KqZ5z8sqlk2UuXbo0bdq0e/fu1a9fPyAgwJWXlrl69erFixeNRuPixYvbtGkjMBIFiY8HgBYtbPeGhADA+fOui6cke/bsWblyJYBWrVr5+voKjCQuLu727dv16tVbunRp9erVBUaiIPHxcHND06a2e0NCsHs34uPxyCOuDatknFeK5py8cl0h/Ouvv5o3b56Xl+eyK5bG/v37Dx482KVLF9GBKEB6OgBUqWK7V2q/e9d18RQrIiJi6tSp0l8fOHBAbDAWu3btunnzpru7u+hAFCA9HV5e0NsZc/L2BhSUThacV0rnnLxyXSEcOHBgXl6eu7t7aGhow4YNm9or6S5x+fLl+Pj406dPZ2RkvPDCC1euXBEYjFJUrgwAWVm2ezMzAftl0rVyc3PnzJkDoEaNGk2bNm3Xrp2f0JWOp06dunXr1tGjR+/evfvKK69s2rRJYDBKUblycfcjJaWTBeeVCjgnr1xUCH///fdTp04B2LBhw3PPPeeai5bo119/7dix49WrV2NiYnr06CE6HNEaNwaAhAR062ajVxo49fd3aUh2rFu3Ljs7293dPT4+3sfHR3Q4BSZNmrRixYrdu3ffuXNHOVEJ06QJjh9HYqLtaetSOjVp4tqYSsB5pQJOyiunzHAtok+fPgBGjx7tmsuV3oIFCwCEhITk5eWJjkW0/fsJoP79bfc+8wwBtG+fa2OyITU1tUaNGgB27NghOhYrZrP58ccfBzB16lTRsSjA5MkE0Nq1NrqyssjXl7y86N49l4dlF+eVOjgnr1xRCHfv3g2gatWq169fd8HlHkhWVpa/vz+AtTb/y2pKfj4FBpJeTz/+KO/6z39Ir6egIMrPFxGZlYkTJwLo2rWr6EBsOHHihMFgcHNz+/3330XHItrZs2QwUMOGdOuWvGvuXAJo7FgRYdnFeaUOzskrpxfC3Nzc5s2bA4iIiHD2tcpm+/btAPz8/G4V/S+rNT/8QG5u5O1NK1dScjIRUXIyrVpF3t7k7k4//CA4PKLffvvNzc3NYDCcOnVKdCy2jRo1CkDfvn1FB6IAb75JAAUHU3Q0ZWYSEf3xB40fTwA1bkwpKaLju4/zSk2ckFdOL4TLli0DEBQUlJOT4+xrlZn0gXDSpEmiAxFB9v8lJoYaNyaAANLrC/6iSROKiREUn5XevXsDGDdunOhA7EpKSpI+5Ozdu1d0LArw7rtUubI8nbp0ocRE0ZFZ4bxSGUfnlXMLYXJysr3/eZMmTTp69KhTr27TuXPnxowZk5ubW7gxLi7OaDQajca4uDjXhySSyUT/+AeNGkW3b99vzM6m/ftp4UKaOZMWLqR9+yg7W1yI933zzTcAfH19b968Wbg9OTl57NixQgbeo6OjFy9eLGtcunQpgODgYFmaadTNm7R5M735Js2cScuX0/HjogOS47xSJYfmlXML4ejRowH06NFD1r5z504ANWvWzJRebF3FbDaHhIQAWL58uaxrzJgxALp37+7KeMRbt44AatiQMjJEh1KCnJycZs2aAYiMjJR1SWk2aNAgF4ck7clgNBrPnDlTuD0nJ0f6HFA0zTTk/HnREZQK55XKOCevnFgI7X3gzc7ODgoKEjU/RZq54+Pjkyx9A/tbSkqKtGZo9+7dro9KjLt3qU4dAujLL0WHUrL3338fQIsWLWSPw2LnEUyYMAFAt27dZO3R0dE200wrEhLIw4P69iXFT8bmvFITp+WVEwuhNOV3ypQpsvaFCxeKXbEgreUYW2RyUUREhPQ5M1sZI4FON3UqAfToo2Q2W7UfPUrnzgmKybakpKRq1aoB2Fdk/Ya9NHMNy5z7qKgoWZe9NNOE/v0JoBEjRMdRAs4rlXFaXjmrEG7btk0a/Lxd+OMT0fXr16tWrQrgwIEDTrp0ic6dO+fm5qbX649bDyvn5eVJA6fLli0TFZvrxMeThwfp9XTsmFV7Xh6FhJCbG333naDIbBg5ciSAfv36ydq//PJLm2nmSqtWrQIQEBCQlZVVuF1KM4PBcPLkSVGxiXHwIAHk7U3XrokOpQScV2rizLxySiHMyspq0qQJgHXr1sm6XnzxRSHD7jKTJk0C0KlTJ7P1y1BMTIxilzw6WN++BNCoUfL2FSsIoMBAhUyQIaLY2FiDweDu7v7HH38Ubs/MzLSXZq6Un5/funVrAEVnN4SHhyt2aZqz5OdT69YE0Lvvig6lBJxXauLkvHJKIZS2a2nbtm2+9frr48eP6/V6Dw+P+Ph4Z1y39G7fvl2zZk2bu0g8+eSTytwEx5FiYgqerWT1PiWFqlcngL7+WlBkNnTu3BnAtGnTZO1SmrVr1y5f9DL/gwcPAqhSpcrVq1cLtyt2sxInWrWKAAoIUM6DlD2cV2qycqVT88rxhfDKlSuVK1cG8IP1+muz2RwWFgZg9uzZDr9oGaxduxZAo0aNMqwnTMbHx3t4eOj1+mOyMcMKIy+PWrUigJYulXeNG0cAPfGEiLBs27JlC4BatWrduXOncLslzX4sug+OCM888wyAl19+Wda+Zs0aAP7+/rIBroopNZVq1CCAvvpKdCgl4LxSk9TUggd0p+WV4wvh888/D2DIkCGy9o0bNwKoXbt2Wlqawy9aBvn5+W3btgWwcOFCWdeUKVMAhIWFyQZOK4jly20Pfp49S0YjGQx0+rSgyOQyMzMbN24M4OOPP5Z12UszUS5cuCA9P/3yyy+F24tJswpowgQCqMhcR6XhvFIZadcYZ+aVgwvhkSNHdDqdp6fnpUuXCrenp6fXq1cPwMaNGx17xfL4/vvvAXh5ef3111+F29PS0urUqQNg27ZtomJzFsvgZ3S0vKtnTwLotddEhGXbvHnzALRv3142SHX48GGbaSbWzJkzATzyyCOy5ydLmiUqbDsVBzt7ltzcFPUgZQ/nlZq4JK8cWQjNZnPHjh0BzJ07V9Y1e/ZsAKGhoSaTyYFXLL9BgwYBePHFF2Xt69atA9CwYcMMxa80fzBjxxJARfcN2LWLAPL1tbGVrSCXL1+WBqn+85//FG43mUxSmr3xxhuiYrPp7t27devWBbB582ZZ18CBAwG89NJLQgJzkV69CKAJE0THUQLOK5VxSV45shCuX78eQP369dPT0wu3X7x40dPTU6fT/fzzzw68nEPYi81kMoWGhgJYsGCBqNgcLy6OjEYyGsl6xwrKyaGmTQmg1asFRWaDdG7l0KFDZe2WNLunpEN8JJ9++qnN2JT8R8Axvvqq4EHKepcyBeK8UpOoKNfklcMKoWXw87PPPpN12XvrUgh7b6uHDh3S6XSVKlWSDZyq17gB1xI6DafwcHnHokUEUMuWytkHRBqkqlSpkr0x9qJPx0pQzFuFYgdFyi87m/I6dCSAVq4UHUsJOK/UxPKAvmqVsy/lsEL4+uuvA3j44YftDWQrtpwU8/1yyJAhAJ5//nkhgTnWzp0EUI0adDvVegbQjRtUtSoB9O23gkKTM5lM//znPwG89dZbsi57aaYcJd5qFfWZ3CHee4+a+t2KGzJPOQ9SNnFeqUve0kgCKCTEBXnlmEJ44cIF6Q1dpVOb7M1oTUxM9PLyqgAjD9nZFBREAK1ZU6Tv5ZcJoGeeERCWHZ988gmABg0ayAaC7KWZ0gwbNgzAs88+K2tX2sRph7hxg6pVI4D27xcdSkk4r1Tk+nUKqpP+3y6zzQdccQCcYwrhgAEDAAwfPlzWbm+tntIUs8Zx7ty5ADp06KDqkYeFC20/Wl399Tp5eZGHByUkCApNzjI14IsvvpB12VtTpTT21qKZzeaHHnoIwJw5c0TF5nAjRhBA/fuLjqMknFfq4uK8ckAhtLf9QTG7tyiQvV1vMjIyGjVqBGD9+vWCQisvy9inbHtXs5kefZQ6Nbj052L5rUGgGTNm2Jwsbi/NlGn+/Pk2dyeR1hcpYXMlh/j1V9Lryd2drDcpUyLOKxVxfV6VtxDm5+e3adMGwKJFi2Rd9vbzVCx7+6B+9tlnqh55eOklAmjgQHn7Z58RQLVrk3L+tRISEuwtH7aXZspUzH6VCtlut/zMZnrsMQJo5kzRoZSE80pFhORVeQvh6tWrUVG2SLd3MobZbO7UqROA119/XVRsZXb8eMGzlew8y4wMatSIAFLUi+7TTz8N4N///res3V6aKZm9EwyUcACLQ3z+ecGDlPUmZUrEeaUimzcLyKtyFULL3q+7du2Sdan00Cx7ZyX++uuver3e3d39vErO3ZaYzRQWRgAV3d517lwCqEMHUs6nT2mQytvb+5r1MSvFpJnCSWfaTZ06VdYu/EjO8svMpMaNCaBPPxUdSkk4r1QkM7PgAd3FeVWuQjhx4kTYOg3E3inwypednR0UFARg7dq1sq7hw4cDGDBggJDAymbjRtuDn4mJ5OVFOh0pZzKs5dCZ9957T9b12muvwdZp3cpn75TzYtJMLd58kwBq315BD1I2cV6pyxtviHlAL3sh/O2336TBz1OnThVuz83Nbd68OYDly5eXOzwBduzYAcDPz++W9WZjN27ckEYevlXMervipadTvXoEUNH1RUOGEECKWh65cuVKaZAq23orcHtpphajRo0C0LdvX1n79u3bbaaZKlgepH76SXQoJeG8UhGBeVX2Qti7d28A48aNk7UvXboUQHBwcG5ubvliE6ZHjx4AJk2aJGtftGgRgJYtW6pi5GH2bAIoNFT+bHXoEOl0VKkSKWeHg9TU1OrVqwP4qsgxK/bSTC2SkpJ8fHwA7N27V9ZlL82U79lnCaBhw0THURLOK3URmFdlLIRff/01AF9f35vWW8AV879HReLi4oxGo9FoPGO9J2dOTk7Tpk0BrFbSnpw2XbxInp42Bj9NJgoNJYAUtYXq+PHjbQ5S2UszdbH3aGgvzRTuxAnS6cjLi5R/5gHnlajYysDygP7nnwKuXpZCmJOT06xZMwArVqyQddl7YVedsWPHAuhe5JSGXbt2SX+EFD7ycOwYtWhBL7wgb//wQwKoYUNSzg4HZ8+eNRqNBoPhtPUxK8WkmboU87HAXpop3Ndfk/I/QnFeqSivTCb6xz8IoPnzxQRQlkL4/vvvA2jRooXsScTeJ1w1SklJkQZVdu/eLevq2bMngIkTJwoJrPRyc+Xzj9PSqE4dAkhRxyz26tULwIQix6zYSzM1io6Otjl9LCUlxc/Pz2aaqcXNm2Q9jV8pOK9UlFcffST4Af2BC2FSUlK1atUA7Nu3T9YlTeqdMmWKg2ITbPny5QCCgoJkn9mlJ02j0Xha8QeQykyZQgCFhZFydjiIioqyN8ZuL81Uyt6CooiICJtppnxnzlD79uTrS1WqUFgYKWpjFs4rdeXVqVPUpQtt3SosgAcuhCNHjgTQr18/Wbu9ZZ7qlZeXFxISAmDp0qWyrnHjxgF44oknhARWNpcukbs76fUUGys6lL9ZvrmuKnLMir00Uy9piwm9Xn/8+PHC7cWkmcL17k2LF5PJRJmZ1LkzKed0WM4rUmdeCXxAf7BCGBsbK60r/8N6D7hiNv5RtZiYGGkp7vXr1wu3WwZOv/76a1GxFRYRQQEB1Lkz5eRYtWdkUEAAPfdcwd/u3ElFzp8RafHixdIsXNkglb00Uzt7mw7aSzNRBgyggACaPl3evm8fBQTc/zqYn3//zhUZSa1bW/3m4GAS9YWE80qi0ryShIdTZKTLQnvAQti5c2cA04v8q9jbCrYC6Nu3L4BRo0bJ2lesWAEgMDBQCSMP0ipUgGQ7JqanE0BduggKq1iWdZn7i5zfYy/N1K6YbejtpZkQHTsSQHo9HTli1b5jh40ck0yZQk89ZdVSrx6dPevEIO3hvCpMvXk1ejQV2QLBiR6gEG7ZsgVArVq17ljPwbB3OEjFEB8fL23Xe+zYscLteXl5rVq1AvD++++Lis1CKoTVq1OlSnThwv12JRfCESNGAOhf5JwVe2lWMdg7mMxemgnRsSMZjVStGnXoQIWfbO0VwqtXyc+PpAVTf/5JkZEUGUnVqtGsWRQZSd9957rIifNK/Xm1ahVFRtKjj9LTT1NkJH30kSti06N0srKypEOc33nnHelrs8XMmTMzMjKGDBkiTZapYIKCgsaPH282m6UFqpZ2o9EYGRkJ4O23375+/bq4AO+bNQvZ2ZgwQXQcpRAbG7tx40Z3d3dpCp+FJc0WLVokS7OKYdSoUW3btk1MTJSmYlnYSzNRjEbMmIHYWKxeXcLvvH0b/fph2DD06QMAJhMyMpCRASJkZSEjAzk5Loi3AOdVBcgrKX/y8pCbi4wMZGa6JLJSFsyBAwcCaN++vWzw8/DhwzqdztPT89KlSw6u0YqRlpZWp04dAF9++aWsq1+/fgBGjhwpJDAL6Y3wxx8LTlzavr2gXZlvhCaTyd/fH8DMIuesvPXWWzbTrCL5/vvvAXh5ef1lvbVPMWnmYh07kqcnZWVRkybk7U2XLxe0F30jPHuWmjen8eNtTHNw/dAo51WFySty+dCosTTF8ujRo9JC8hkzZhgMBku75UFj+vTp0mSZCqlq1arz588fM2bMtGnTnnrqKS8vL0vX8uXLDxw4sH79+oEDB7Zt27ZsP1+v9zObK5XtnzUYUKfO/b99911ERSE8HD17omrVsv1Ip5s4ceKlS5eMRqP0kG5x5coVabOMyMjIwmlWwXTt2nXQoEE7d+6cO3fupk2bLO2WNJs6dWqHDh0qVSpjSuh0dUs/0iPj5QVf34K/9vTEkiUYMgSTJmHHDhu/eds2vPIKxo3D6NG4dAkA/P2h05Xtyg7AeVUx8kqM0lTLQYMGAahdu7as/cqVK8HBwfXr1793757ja7SS5Ofnt2vXrkGDBkXXDo4ePdrd3b08/wvCwuKlqS5l+FWrFlGhN0IiWrqUAAoPJ1LqG2GtWrUAvFBk25u9e/f6+PgMHTpUSFSudPHiRU9Pz06dOslmWuXn5wcGBnp7e5cnnWrVMpU5nV58kejvJ3dJnz4EUHQ0UZEn98BACgiw+iV2C17Oq4qRV0KU6o1Qr9cDuHfvntlslv5aUr9+/dOnTyckJEiTZSowg8GwY8eOunXrFn4dlCQnJ+fm5latWrVKlSpl++E+PlSvXhkDq1lT3hIejo0bsXo1Xn4ZQUFl/LFOpdPpACQmJsra+/Tpc/78+fz8fBFBuZS/v//Ro0dbtWqls36BysrKSk9Pz8zMrFmzppubW9l+ePXqZqOxjE/ufn7ylshIfP89Jk5E9+7yroSEsl3EWTivKkZeiVGaann9+nVpSCEiIsLZlVldDh06pNPpKlWq9JfQoxwKvxES0c8/k05HYWF0964S3wg//PBDAHq9/uLFi6JjUZbZs2cDCA0NNQk95a/wkzv9fYbzO+8o4sm9GJxX9nBelai0k2Wkr83169dPT093akAqYjKZQkNDASwQfZSDrBAS0fDhBNCGDUoshET0xBNPANDCaFXpSeNaOp3uZ9HHJctuWJmZ5O9PVarQ6tXib1jF47wqivOqNEpbCM1mc8eOHQHMnTvXqQGpiPQE2rBhwwzRRzkULYRJSeTrSw0bKrQQXr58uQKvPS0baWL2SwrYqUx2wyKi6OiCPZGF37CKx3lVFOdVaTzAgvojR45IKyV45IEKTUrepoCjHIoWQiL64IOCL9UKLIRENG/ePFTQ3YjKQJr7XqVKlasK2Lu66A2LiJ5+2vbuRUrDeVUY51UpPcDHz4cffvj555/Pzs6eMWOGI75Oqtu8efNu3LgRFhY2ePBg0bHYNnYsHnpI3qiANbUFZsyY0aRJk5MnT65fv150LIKZTCZpu8hZs2bVK/O8KSdbtQqqmBLHeWWh3rwScJt6oLJp2U3thx9+cE5hVgfLxkWyHd9F2bqVhgyxsX75+HEaMqRgo+30dJo5kxS17f7WrVtRcXe9Kr01a9YA8Pf3z8rKEh0LEdGsWTRsmI32Tz6hIUMoKsrlAT0gziuJGvMqIYH69yfXH5jxwMcwLViwAEDbtm21PPLw5JNPAhg9erToQB5ASgpVr04AKePAjALSPsjTpk0THYgwqampNWrUgK0dk5UpLY0UsM98CTivVJdXkpgYAsjbm1x8YMYDF8KsrCxpE5kPP/zQGQEp34EDBwBUrVpVIYeblN6KFQRQYKCCbmSxsbEGg8Hd3f13UWf2iBYeHg6ga9euogMplagoqlPHpXtflQ3nlbryqrC+fQkgFx+Y8cCFkIi2bdsGwM/PLyUlxeEBKZzluMtly5aJjqUEly+T7Ni1vDxq1YoAUsCBGfe98sorAJ6SneKjDb/99pubm5vBYDh58qToWErl4MGCB/Zr10SHUhLOK1Xk1eHDJBu4jY8nDw/S68mVB2aUpRASUZcuXQBMnjzZsdEoX0REBICgoCAlHENYjAMHyMuLHntMvhvyd98p7kaWlJQkHQiwb98+0bG4Wu/evQG8+uqrogN5ANI0v3//W3QcJeG8Un5evfEG6XS0cKG8fcoUAigszHVn1pexEJ48edJgMBiNxri4OMcGpGQpKSl+fn4A9uzZIzqWEty9S3XqEEBbt8q7+vUjgEQfmGFlyZIlAFq0aCE7Urxii46OBuDj43Pz5k3RsTyAhISCB/ZffhEdSkk4r0THUgJpDywvL5JtzJWWVnD7ctmBGWUshEQ0evRoAD169HBgNAo3ZswYAN27dxcdSKl89BEB1KAByZb7W25kR48KiqyInJycZs2aAYiMjBQdi4vk5OQ0b94cwPLly0XH8sBmzCCAHnnEdQ/sZcN5pXyDBt3flbuwdesK1tq7ZreSshfC5ORkHx8fVbweOYTqXoJNJvrHPwig+fPlXdOnK+5G9s033wDw9fVV/mOsQ0gvK8HBwWp8Wbl7l+rWJYA+/1x0KCXhvFK4v/4iLy/S6Ui2AZzl9uWa/SvLXgiJaNmyZar4YOYQavwseugQ6XRUqRL9+adVu+VGtmWLoMhsUcuHjfKzfL7au3ev6FjK6JNPCKD69Un5J7BxXincnDkEUGgoybYEt9y+XHCiQbkKYW5urvQaXuFPpdi+fbtKJ8o++ywBNtaxfvxxwcCpcm5klqlup06dEh2Lc1WACY0mE3XsSAC9+aboUErCeaVwGRnUqBEBtHGjvGvIEALo+eedHkO5CiER7dmzR6WL6kovKyvL399fpUsnExMLRh5++smq3WSif/6TgIJ9ZxRi4sSJKl38VHonTpwwGAxubm5qX+J2+HDBA/ulS6JDKQnnlcJt2kQA1a5NaWlW7fZuXw5X3kJIRH369AEwZsyY8v8oZXr77bcBhISE5Ik9gbus3nyTAGrfXj7y8N//2h44FciyHcbOnTtFx+Isjz/+OICpU6eKDsQBnnuOAFL+qUecVwpnNlNYGAE0e7a8SzpRoEMH+e3LsRxQCOPj493d3ZWz8aZjXblyRTp6/sCBA6JjKaPMzIKRh08/lXcNHUoDm56+OvFdEXHZ9sEHHyhqg0THsmyDefv2bdGxOMDly1S5so2TTxSI80rhjh8nvZ7c3Sk+3qr93j1q0IDef3hnxuZdzru6AwohEU2ePBlAWFiYWTnTEB3khRdeADB48GDRgZTL5s0FIw+yXYjv/HWHvL1tzNkSJz8/v02bNgDeeecd0bE4WGZmprQ94UcffSQ6FoeZN48AateOFL73MOeV8r34IgE0aJC8Pe3LfQRQ3bp0966TLu2YQmg5nG/79u0O+YEKIR3B6OHhES97SlEbs5kee4wAmjmzSN9bb9keORVHUYeoOdD8+fNR4Y7Ky8ykbm1uxnV+1fTxJ6JjKQHnlcJdv05VqxJA8tE3s5k6dSKAXn/dSZd2TCEkJR3X7ihms/mhhx4CMGfOHNGxOMDRo6TXk4cHXblgvdYlM5MaNyaA/u//BIVmw4ABAwAMHz5cdCAOYznCrCr7+80AAAv4SURBVOIdnm7e+iUBVKuWfMBBeTivFO6ddwighzrkykcYfv21YOT0/HlnXNdhhdBkMoWGhgJ4++23HfUzxdqwYQOA+vXrp6eni47FMZaGJ17v+DT17y/v+OILpd3ILly44OnpqdPp/ve//4mOxTGGDRsG4NlnnxUdiHM8/jgBpPiZGpxXCpeVRe/1+SE7oAWtXSvve/llAuiZZ5xxXYcVQiL6+eefdTqdl5fXXy5YAOlk6enp0pnOmzZtEh2L49y4UTD0sH+/vKtzZwJo+nQRYdk2a9YsAA8//HAF+PB8+PBhnU5XqVKlS8pfalA2J06QwUDu7qT4ufucV0q3YwcB5OdHt25ZtVtuX99+6/BrOrIQEtHgwYMBvPDCC479sa5Xkf60WFm8mABq2ZJkOzDFxhaMPMiObhKnwjyLmEymjh07AnhT+YvPy+OVVwggxa/m5rxSgR49CKBJk+TtixYV3L4cvZLNwYUwMTHRy8tLp9P9rJhZiGVw8eLFCjZ+cl9ODjVtSgCtWiXvGjmSAOrXT0RYtlWM0elPP/1U+re4p5xdfJwhKYmqVSOAFL+/F+eV0sXFkdFIRiOdOWPVbrl9rV7t2As6uBAS0Zw5cwCEhoaaFDML8UENHDgQwEsvvSQ6EOeIiiKAfH1Jtg2x5UammPPbzGaz9Mw7d+5c0bGU0d27d+vWrQvgc+VvUF1+S5YQQMHB8vEGheG8UoGxYwmgokf97NpVcPuSDZyWj+MLYUZGRqNGjQBs2LDB4T/cBSrqHGsrvXoRQBMmyNvfe48AatFCOTcyaQWLp6fnxYsXRcdSFjNnzgTwyCOPVLQxdptycqh5cwJI8ccecV4pXUoKVa9OAEVHy7t69iSAXnvNgVdzfCEkok2bNgGoXbt2mmznOMWrwKturZw9S0YjGQx0+rRVe04ONWtGAK1YISgyG9S7p8GFCxc8PDz0ev0vyj/E1lGio22PNygP55XSLV9OAAUGkux0I+n2ZTTKb1/l4JRCaDabO3XqBGDWrFnO+PnOU7H3YbIyfjwB1K2bvP3rr5V2I1PvLnf9+/cHMGLECNGBuFbv3gSQ4o894rxSurw8atWKAFqyRN41bhwB9MQTjrqUUwohER0/flyv17u7u593zvpHZ9DCzrz3paYWjDx89ZW8q2dP0ulsnIkijhr3PT948CAAb2/va9euiY7FtX77jdzcyGCgkydFh1ICziuli4khgLy9SXa60a1b5OtL3t504YJDruOsQkhEL730EoCBAwc67xKOFR4eXuHParGyciUBFBAgH3n4/XdS2JBLVlaWtJuiWk7Cys/Pb926NYB331XQhuauEx5OACn+jxLnlQr07UsAjRolb4+JIcc9CjixEN64caNq1aoAvnXC+keHs5zeeVLxj7EOk59PrVsTQO+9JzqUkm3btk1FZyOvWrUKQEBAQMUfY7cpNZVq1KBHHiHFH4bAeaV08fHk4UF6PR075ryL6IgITrNo0aI5c+a0bNny1KlTRqNR1jtixIgDBw447+o2hYSE2Lxonz599u/f/+qrr65Zs8bFIYl08CC6d4e3N/74A3Xrio6mBF27dv3xxx8nT54cERFRtDcgICAnJ8fFIU2YMEHae6Gw27dvN2vW7NatW1FRUc8884yLQ1KKhAQEBkKnEx1HyTivlG7aNCxbhkcfxaFDzsoo59VYIsrJyWnatCmADz74oGhvv379nPKvVKy2bdsWjeSbb74B4Ovre1MxM0Rc5+mnadAgunLlfktWFu3eTQsW0MyZtGABRUdTZqa4+O47efKkwWAwGo1xcXFFe93d3V2fTjNtHOdBEyZMANCt6EQkbUpKoo0b6Y03aOZMWrqUjhwhhc3457xSujt3qHFjmjPHalmXQ/PKuW+EAHbt2jVo0CA/P7/z589Xr169cFdqampWVpZTr16Uu7t7zZo1C7fk5ua2bt36/PnzkZGR0mdCbcnNReE/6nv2YMwYXL0KAHo9zGYAqFcPa9fi6afFRFjI2LFj161b171795iYGFmXNHfAxfF4e3tL4/8W586da9u2rdlsPnHihPQ5R7uI8PbbePddSH/MLen00EP4/HMEBoqNrjDOK6UrfJtyRl6Vt1aXQo8ePQCEh4e74FplsGTJEgDBwcG5illFLsz+/WQ0ko8PrV1bsHFDSgqtXUvVqpHBQLt3i46PkpOTfXx8AOzZs0d0LLb16tULwPjx40UHogDTphFArVvT3r0FE7ISEig8nHQ6qlPn/jzAw4fps8/u/xKB80pNSplXD8IVhTAuLs5oNBqNxjOyjeMUICkpqVq1agD2Kn6DRKfLzaUGDchopCNH5F3//S8ZDFSvHuXkiIjMyrJlywAEBQVlyya7KsBXX30FzY6xy8TGkk5HgYE2zvaaP58AsmzNv3YtPffc/V+CcF6pQ+nz6kG4ohAS0auvvgqgU6dOrrlc6UmneT2l+C3zXUFaSj90qO3eoUMJoF27XBuTDXl5eSEhIQDeeust0bFYSU9PDwwMBLBy5UrRsSiAtGPD+vU2unJyqFYtcndXzvmXxHmlFs7JKxcVwpSUFC8vLyhsl9svvvgCgMFg+F3xh6i5wvTpBNCnn9ru3bCBAJoyxbUx2RYdHQ1Ap9PZnN0gypNPPgmgfv36PMZORNSmDQFkb8PeYcMIIIVt6cJ5pQLOySv5kgYn8fPz69WrV1RU1KJFi9asWVO7du0GDRq45tI2JScnX758OS0tDUC7du2aN28uMBiluHIFAPz9bfcGBADA5cuui8e+p556qmbNmjdv3mzfvr23t3fTpk1lMwtcLCEhIS0tLTU1FcD48ePd3NwEBqMUV67A0xP16tnuVVI6WXBeqYBz8spFhRDA5s2b/f39k5OTU1NTU1NTz50757JLF8Pb2zsqKkp0FMogTcHy8LDd6+l5//cowIYNGwYMGJCbm5uamvrLL7+IDqdAy5Ytiy7/0qisLBSz8EBKs8xMl4VTSpxXSuecvHJdIfTy8kpMTPzoo48yMzNr1qwp/I3w6tWrBoNhzJgx3t7eAiNRkGrVACAtzXbvnTsA4OPjuniK9eSTT8bHx2/ZsgVAYGCg8Cf39PT0WrVqDR8+XGAYylKtGm7ehMkEg8FGr5RmikknC84rpXNOXrmuEALw8PB47bXXXHlF9gCCgwEgLg69e9vojYsDgBYtXBpSsRo1aiSdyiZcz549RYegPC1a4MYNnDuHVq1s9J45AwAtW7o4qNLgvFI05+SVvtxxsYpC+lO3bRuKLh8mwtatANCrl6ujYirVowcAfPmlja6kJPzwA+rUQZs2Lg6KqZ5z8ooLIftbhw7o2hXHjmHFCnnXypU4ehTduiE0VERkTIVGjoSPDyIiEBtr1Z6Xh9GjkZuLyZNRZP9hxkrgnLxy+hZrTE3+/BOdOuHaNQwahH/9C/Xq4fp1bN2KHTtQrx4OHUKTJqJDZOoRFYWhQ+HmhnHj0KMHKlfG779jzRrExqJnT+zZw4WQlYUT8ooLIbN2+TKmT8fOncjPL2gxGjF4MJYsgdD5TUyVfvoJ06bh2LH7LdWqITwcc+YUN/ePseI5Oq+4EDJb0tJw6hRu34avL9q2LZhQyljZXL6MP/5AZibq1kX79vwiyBzDcXnFhZAxxpim8WQZxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKZxIWSMMaZpXAgZY4xpGhdCxhhjmsaFkDHGmKb9P24lAPpxKXztAAAAuXpUWHRyZGtpdFBLTCByZGtpdCAyMDI0LjA5LjYAAHice79v7T0GIBAAYiYGCOCE4gZGNocMkAAzkQwNEIOFnQFMs3JAaCYYzc3A6MHEyOTAxOzBxMziwMLqwcTKxsDGzsHExsHBxMrgIMIIVMbGwMrCzMQoXgZkMzLAXBQaenXfQ7dl+0Gc0NCv+2Hs1au0DpTMWq6KJG4PYYPV20PUrLIzsNq9FMJ+Ze/j57oUokbVAWEmmA1WLwYAZV8weGv979IAAAD0elRYdE1PTCByZGtpdCAyMDI0LjA5LjYAAHichZJdbsMwCIDffQouUAv/xDGP+amqaYojrenusPfeX4NEGYmquRAk43xgDDYg8jV+/jzhT/xoDABWPiKC74CIZgJZQH+9fRQYlq7fd4b5UZY7ECuKnslumad9x8EAF7TRpZRauDjriTBkQIuraKwX0ll6TwYhvU1pJfX/CxhPKSsZm1OVFTAxiDasIhH/Ht1C4Tz5PZhhBm+bvIGVo+kIVrhrGU8T2GbSz2XUmUQ2r42PbEG7G8W0h6KNdoodSNoPx9bqrT1b1ruJS3qDKAHHQo9lib8/Ml6bX4/8g+/nc69mAAAAc3pUWHRTTUlMRVMgcmRraXQgMjAyNC4wOS42AAB4nFWN0Q2AIAxEV/ETktK0FKuEsIIMwRoMr5gAep/vXe5KvkwutnLt4a0Zj/spIuAYfYwUIDF2IECQhpyOUGRIRxhYVY+ln5HIf+JR3w597PpaG5PZdgOJIyJlASzxKQAAALx6VFh0cmRraXRQS0wxIHJka2l0IDIwMjQuMDkuNgAAeJx7v2/tPQYgEABiJgYI4ITiBkY2hwyQADORDA0Qg4VdQQtsGDMHmPGfgRHO4GZg9GBiZHJgYvZgYmZxYGH1YGJlY2BjZ2DjYGBlcBBhBCpjY2BlYWZiFC8DshkZYE4KDb2676Hbsv0gTmjo1/0w9upVWgdKZi1XRRK3h7DB6u0halbZGVjtXgphv7L38XNdClGj6oAwE8wGqxcDAAJuMsYdLHN5AAABAnpUWHRNT0wxIHJka2l0IDIwMjQuMDkuNgAAeJyFks1uwzAIgO9+Cl4gFv6JYw47NEnVVlUdacv2Drvv/TVI5ZFobQpGMs4HxhADIu/j9fsH/sSPxgDgziIi+AqIaG4gG+iPp0uBYT709WSYPsv8AcSKolvyME+3euJggAZtdCmlDhpnPRGGDGhxEY31QjpLr8kgpLcpLaR+/wfGTcqdjO2myh0wMYg2LCIRT6/uoHCe/ByE4Xx68xXPMIG3bb7jDwpY8MZVntb8a/xYxs1U7nPqpzLqnCKb12FEtqAdj2LaV9FWu8cOJO2RY+u0E44t60vFJX1IlIB1oeuyxK8/Hu/NL7coiGiwrK77AAAAe3pUWHRTTUlMRVMxIHJka2l0IDIwMjQuMDkuNgAAeJxVjcsNgCAQRFvxCBE2+0GU0IMWQDjRBsULJojOafPeZiZdNqdz5axSu3Sh0kNLVQzbISLGEnAI6Ewk6EAMmjjk6xBEhrQIjrz3+9StJNCfMPjnBz92bs2Ol+l6Ax6gJMp2CxK7AAAAwHpUWHRyZGtpdFBLTDIgcmRraXQgMjAyNC4wOS42AAB4nHu/b+09BiAQAGImBgjghOIGRjaHDJAAM5EMDRCDhV1BC0gxMrBwMIAFmDjAAv8ZGLkZGD2YGJkcmJg9mJhZHFhYPZhY2RjY2DmY2DgYWBkcRBiB6tgYWFmYmRjFy8CGwJwUGnp130O3ZftBnNDQr/th7NWrtA6UzFquiiRuD2GD1dtD1KyyM7DavRTCfmXv4+e6FKJG1QFhJpgNVi8GAEDfMbB79XwlAAABBHpUWHRNT0wyIHJka2l0IDIwMjQuMDkuNgAAeJyFkktuhDAMhvc5xX8BIudBSBZdDDCaVtUEqaW9Q/e9v2ozYgxqh9qxFIfPjmNjIPI2vn594y5+NAagg1VKwWcgInOFbNCfLy8Vw3zq15Nh+qjzOworie7J0zxd1xOHAQ3Z6FJKHRpnfSkUMsjSIhrrhXS2/E8GIb1NaSH1+y8w7lIeZGx3VR6AiUGyYRGJeHh1h8p58mMQw/Plya14xgRv23zDDwooW/APbknb3POe67gbx21A/VRHHVBk8zqFyBa01VFMGyraatvYQdLmOLZOW+DZsj7RsVv0IVECtoVuyxJ//eN4b34AyUWG29C9hnYAAAB5elRYdFNNSUxFUzIgcmRraXQgMjAyNC4wOS42AAB4nFWNwQ2AIBAEW/EJES53HKKE2IIUQHjRBsUrJoDuc2azG890rVmkqLMsVFpoqcLAdjCz0gTGe7QqEDTAClXocjgE5i41giXn3D71M+LpTwy4t4MfO7/mxmCy3oulI/Bg3R2/AAAAAElFTkSuQmCC",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "markdown",
   "id": "0a6b69dc",
   "metadata": {},
   "source": [
    "We can then define a recursive SMARTS query which combines the three representation with a **\",\"** representing an \"or\" condition.  The initial **\"N;\"** isn't strictly necessary, but I like writing the SMARTS this way to remind myself that I'm matching a single nitrogen. "
   ]
  },
  {
   "cell_type": "code",
   "id": "21fcc0b6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.200769Z",
     "start_time": "2025-05-05T16:56:06.199262Z"
    }
   },
   "source": [
    "nitro_query = Chem.MolFromSmarts(\"[N;$([N](=O)(=O)),$([N+2]([O-])([O-])),$([N+](=O)([O-]))]\")"
   ],
   "outputs": [],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "id": "31c463ba",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.206260Z",
     "start_time": "2025-05-05T16:56:06.204657Z"
    }
   },
   "source": [
    "hal = [x.GetSubstructMatches(nitro_query)[0] for x in nitro_mol_list]"
   ],
   "outputs": [],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "id": "a3b2490b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.216793Z",
     "start_time": "2025-05-05T16:56:06.209961Z"
    }
   },
   "source": [
    "MolsToGridImage(nitro_mol_list, highlightAtomLists=hal)"
   ],
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAADICAIAAAC7/QjhAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd3xN5x8H8M9dCSGRxGhsEbGJXSr2LmrTatHWLCq2oqhRasVqqfpVUVWr9qpRrS21QqwkxEiEkET2uLn3+f1x9Lo5uTfLPfc51/2+X/5onydxvvjmfM99zjMUjDEQQggh9krJOwBCCCGEJyqEhBBC7BoVQkIIIXaNCiEhhBC7RoWQEEKIXaNCSAghxK5RISSEEGLXqBASQgixa1QICSGE2DUqhIQQQuwaFUJCCCF2jQohIYQQu0aFkBBCiF2jQkgIIcSuUSEkhBBi16gQEkIIsWtUCAkhhNg1KoSEEELsGhVCQgghdo0KISGEELtGhZAQQohdo0JICCHErlEhJIQQYteoEBJCCLFrVAgJIYTYNSqEhBBC7BoVQkIIIXaNCiEhhBC7RoWQEEKIXaNCSAghxK5RISSEEGLXqBASQgixa1QICSGE2DUqhIQQQuwaFUJCCCF2jQohIYQQu0aFkBBCiF2jQkgIIcSuUSEkhBBi16gQEkIIsWtUCAkhhNg1KoSEEELsGhVCQgghdo0KISGEELtGhZAQQohdo0JICCHErlEhJIQQYteoEBJCCLFrVAgJIYTYNSqEhBBC7JqadwBElmJicOMGYmPh5oZateDuzjsgYssePEBwMFJTUaIE6taFoyPvgMhbwXJ5RYWQZBYWhnHjcOAAdLpXLSoVOneGvz+8vLhGRmzQsWOYNAmBga9bChXCiBGYMwdOTvzCIjbO0nmlYIxZLDhi64KD0bw5oqLw4Yfo0wclSyIyEjt2YOtWFCuGU6dQtSrvEInt+P13DBgAJyeMGoXWrVGoEIKDsXo1/v0XTZvixIlXj/AxMUhMfP1d5crxipfYBinyihFi0LgxA9iPP4rbf/iBAaxRIx4xEdsUHs4KF2bOzuz69UztWi3r2ZMBbMaMVy1jx7LSpV//IiQb0uQVfSIk/zl/Hu+9h2bNcOqUid5mzXDmDE6fhq+v1SMjNuibbzB7Nr79FtOmibuio1G2LAoWxJMn9L6Q5I00eUWzRsl/jh8HgN69Tff26/f6awjJkZAqvXqZ6CpaFG3aICYGV65YOShi86TJK6tOlgkLC5s4cWJiYmLp0qUrVqxozUuLRERE3L9/X61WL1iwoHbt2hwjkZGQEACoVs10b40aABAcbL14cnLw4MGVK1cCqFmzppubG8dIgoKCYmNjS5UqtWTJkqJFi3KMREZCQqDRwNvbdG+NGjhwACEhaNLEumHljPJK1qTJK+sVwocPH1apUkWr1Vrtirlx5MiREydOtGzZkncgMpCQAACFC5vuFdrj460XT7b8/f0nTJgg/PfRo0f5BmOwa9eu58+fOzg48A5EBhIS4OQEpZkxJ2dnQEbpZEB5JXfS5JX1CmHPnj21Wq2Dg0P9+vXLli3rba6kW8Xjx49DQkKuX7+elJT0ySefhIeHcwxGLgoVAoCUFNO9ycmA+TJpXenp6dOnTwdQrFgxb2/vOnXquHNd6RgYGPjixYuAgID4+PghQ4Zs2rSJYzByUahQdvcjOaWTAeWVDZAmr6xUCO/cuRMYGAhgw4YNH330kXUumqPLly83atQoIiLi2LFj7dq14x0Ob+XLA0BoKFq3NtErDJx6elo1JDPWrl2bmprq4OAQEhLi6urKO5xXxo4du2LFigMHDrx8+VI+UXFToQIuXcKjR6anrQvpVKGCdWPKAeWVDZAorySZ4ZpFp06dAAwbNsw6l8u9OXPmAKhRo4ZWq+UdC29HjjCAdetmurd7dwaww4etG5MJMTExxYoVA7Bz507esWSi1+tbtGgBYMKECbxjkYFx4xjA1qwx0ZWSwtzcmJMTS0y0elhmUV7ZBmnyyhqF8MCBAwBcXFwiIyOtcLk8SUlJ8fT0BLDG5N+sXcnIYF5eTKlkf/8t7vrnH6ZUskqVWEYGj8gyGTNmDIBWrVrxDsSEq1evqlQqjUZz584d3rHwdvMmU6lY2bLsxQtx19dfM4CNGMEjLLMor2yDNHkleSFMT0+vUqUKAH9/f6mvlT87duwA4O7u/iLr36y9OXmSaTTM2ZmtXMmiohhjLCqKrVrFnJ2ZgwM7eZJzeIzdunVLo9GoVKrAwEDesZg2dOhQAJ07d+YdiAzMnMkAVrUq27+fJSczxtjdu2zUKAaw8uVZdDTv+F6jvLIlEuSV5IVw6dKlACpVqpSWlib1tfJNeEE4duxY3oHwIPp3OXaMlS/PAAYwpfLVf1SowI4d4xRfJh07dgQwcuRI3oGY9ezZM+FFzqFDh3jHIgPffccKFRKnU8uW7NEj3pFlQnllYyydV9IWwqioKHP/eGPHjg0ICJD06ibdvn17+PDh6enpxo1BQUFqtVqtVgcFBVk/JJ50OtagARs6lMXGvm5MTWVHjrB589iUKWzePHb4MEtN5Rfia/v27QPg5ub2/Plz4/aoqKgRI0ZwGXjfv3//ggULRI1LliwBULVqVVGa2annz9nmzWzmTDZlClu2jF26xDsgMcorm2TRvJK2EA4bNgxAu3btRO1//PEHgOLFiycLH2ytRa/X16hRA8CyZctEXcOHDwfQtm1ba8bD39q1DGBly7KkJN6h5CAtLa1y5coAli9fLuoS0qxXr15WDknYk0GtVt+4ccO4PS0tTXgdkDXN7EhwMO8IcoXyysZIk1cSFkJzL3hTU1MrVarEa36KMHPH1dU1SngH9p/o6GhhzdCBAwesHxUf8fHMw4MBbNs23qHkbNGiRQCqVasmehzmO49g9OjRAFq3bi1q379/v8k0sxehoczRkXXuzGQ/GZvyypZIllcSFkJhyu/48eNF7fPmzeO7YkFYyzEiy+Qif39/4XVmqjxGAiU3YQID2HvvMb0+U3tAALt9m1NMpj179qxIkSIADmdZv2EuzazDMOd+9+7doi5zaWYXunVjAPvsM95x5IDyysZIlldSFcLt27cLg5+xxi+fGIuMjHRxcQFw9OhRiS6do9u3b2s0GqVSeSnzsLJWqxUGTpcuXcorNusJCWGOjkypZP/+m6ldq2U1ajCNhh0/zikyEwYPHgyga9euovZt27aZTDNrWrVqFYCKFSumpKQYtwtpplKprl27xis2Pk6cYABzdmZPnvAOJQeUV7ZEyrySpBCmpKRUqFABwNq1a0VdAwYM4DLsLjJ27FgAvr6++swfho4dOybbJY8W1rkzA9jQoeL2FSsYwLy8ZDJBhjF25coVlUrl4OBw9+5d4/bk5GRzaWZNGRkZtWrVApB1doOfn59sl6ZJJSOD1arFAPbdd7xDyQHllS2ROK8kKYTCdi0+Pj4ZmddfX7p0SalUOjo6hoSESHHd3IuNjS1evLjJXSTef/99eW6CY0nHjr16thLV++hoVrQoA9jevZwiM6F58+YAJk6cKGoX0qxOnToZvJf5nzhxAkDhwoUjIiKM22W7WYmEVq1iAKtYUT4PUuZQXtmSlSslzSvLF8Lw8PBChQoBOJl5/bVer2/atCmAadOmWfyi+bBmzRoA5cqVS8o8YTIkJMTR0VGpVP4rGjN8a2i1rGZNBrAlS8RdI0cygLVpwyMs037//XcAJUqUePnypXG7Ic3+zroPDg/du3cH8Omnn4raV69eDcDT01M0wPV2iolhxYoxgO3ZwzuUHFBe2ZKYmFcP6JLlleUL4ccffwygT58+ovaNGzcCeOedd+Li4ix+0XzIyMjw8fEBMG/ePFHX+PHjATRt2lQ0cPqWWLbM9ODnzZtMrWYqFbt+nVNkYsnJyeXLlwewbt06UZe5NOPl3r17wvPTxYsXjduzSbO30OjRDGBZ5jrKDeWVjRF2jZEyryxcCM+fP69QKAoUKBAWFmbcnpCQUKpUKQAbN2607BXfxF9//QXAycnp4cOHxu1xcXEeHh4Atm/fzis2qRgGP/fvF3e1b88A9uWXPMIy7ZtvvgFQt25d0SDVuXPnTKYZX1OmTAHQpEkT0fOTIc0eyWw7FQu7eZNpNLJ6kDKH8sqWWCWvLFkI9Xp9o0aNAHz99deirmnTpgGoX7++Tqez4BXfXK9evQAMGDBA1L527VoAZcuWTZL9SvO8GTGCASzrvgG7djGAubmZ2MqWk8ePHwuDVP/8849xu06nE9JsxowZvGIzKT4+vmTJkgA2b94s6urZsyeAgQMHcgnMSjp0YAAbPZp3HDmgvLIxVskrSxbCX375BUDp0qUTEhKM2+/fv1+gQAGFQnH69GkLXs4izMWm0+nq168PYM6cObxis7ygIKZWM7WaZd6xgqWlMW9vBrDvv+cUmQnCuZX9+vUTtRvSLFFOh/gI1q9fbzI2Of8IWMaePa8epDLvUiZDlFe2ZPdu6+SVxQqhYfDz119/FXWZ+9QlE+Y+rZ45c0ahUBQsWFA0cGq7RvboEerry/z8xB3z5zOAVa8un31AhEGqggULmhtjz/p0LAfZfKqQ7aDIm0tNTdXWq8cAtnIl71hyQHllSwwP6KtWSX0pixXCr776CkDjxo3NDWTLtpxk8/6yT58+AD7++GMugVmWsL9rsWLFYmNiMnU8fcpcXBjA/vyTU2hiOp2uYcOGAGbNmiXqMpdm8pHjrVZWr8ktYuHChd7u7kF9+sjnQcokyivbol2yhAGsRg0r5JVlCuG9e/eET+g2OrXJ3IzWR48eOTk5vQUjD4b9XVevXi3u+/RTBrDu3XnEZdrPP/8MoEyZMqKBIHNpJjf9+/cH0LdvX1G73CZOW8TTp0+FXcqOHDnCO5YcUF7ZkMjIyEoeHmdbttRbZQ8yyxTCHj16ABg0aJCo3dxaPbnJZo3j119/DaBevXo2PfJgbn/XiMuXmZMTc3RkoaG8YhMxTA3YsmWLqMvcmiq5MbcWTa/Xv/vuuwCmT5/OKzaL++yzzwB069aNdyA5oLyyLVbOKwsUQnPbH2Sze4sMmdv1JikpqVy5cgB++eUXTqG9qadPn5rc31Wv17/33nu+Zco8yLKHE0eTJ082OVncXJrJ0+zZs03uTiKsL5LD5koWcfnyZaVSmXWXMhmivLIh1s+rNy2EGRkZtWvXBjB//nxRl7n9PGXL3D6ov/76q02PPAwcOBBAz549Re0y/HOFhoaaWz5sLs3kKZv9KmWy3e6b0+v1zZo1AzBlyhTeseSA8sqGcMmrNy2E33//Pd6WLdLNnYyh1+t9fX0BfPXVV7xiyzfhk66Dg0Nw5gMt5flJ94MPPgDw+eefi9rNpZmcmTvBQA4HsFjEb7/9JjxIiXYpkyHKKxuyefNm6+fVGxVCw96vu3btEnXZ6KFZ5t6lGT6qB9vIudsC23r3KQxSOTs7P8l8zEo2aSZzwpl2EyZMELVzP5LzzRl2KVu/fj3vWHJAeWVDkpOThQd0K+fVGxXCMWPGwNRpIOZOgZc/w+zKNWvWiLoGDRoEoEePHlwCyx8bmg1rOHRm4cKFoq4vv/wSpk7rlj9zp5xnk2a2YubMmQDq1q0rnwcpkyivbMuMGTO4PKDnvxDeunVLGPwMDAw0bk9PT69SpQqAZcuWvXF4HOzcuROAu7v7i8ybjRmmnPwpm/V22bOt9ZErV64UBqlSM28Fbi7NbMXQoUMBdO7cWdS+Y8cOk2lmEwwPUqdOneIdSw4or2wIx7zKfyHs2LEjgJEjR4ralyxZAqBq1arp6elvFhs37dq1AzB27FhR+/z58wFUr17dJkYebGjHnJiYmKJFiwLYk+WYFXNpZiuePXvm6uoK4NChQ6Iuc2kmR7GxLCiIHTvGNm9mP/zQ18cHQH8fH7ZwIVu6lK1Zw7ZuZX//ze7cYXLan4zyyrb07dsXQP/+/a1/6XwWwr179wJwc3N7nnkLuGz+eWxIUFCQWq1Wq9U3Mu/JmZaW5u3tDeB7Oe3JaZJt7aE6atQok4NU5tLMtph7NDSXZnKh17OHD9m+fWzRIjZvHluwgM2ezb755uqIEQrASaN5NG4c++ab179mz2YLFrC5c9myZezYMSaD1yKUV7xiywfDA/qDBw+sf3WVcCJJnqSnp/fo0SM6OnrhwoWtWrUy7ho3bty5c+c6d+48a9asvP628lGiRInIyMiAgICQkBBh7YFApVKVKVNm27Zt58+fHzJkiJOTE8cgTWMMiYl4+fJeaOjf58516NBBWMRi8NNPP61bt65s2bJbtmzRaDS8wjR269atIUOGKBSKPXv2vPPOO4b2bNLMtjRs2HD79u137951d3dv3Lixod1cmvGn1+PKFWzbhqtXEREBrRZ6PXQ6odOjcOG6JUu+V7Zsm4oVxd+o04ExpKUhIgJXr+LmTTg7o2hRKBTW/iNQXskwr7LS6fDyJV680D9/3nvQoCfPns2YPr1b9+7WD0TBGMvr9yxevHjy5MnVqlULDAw0vpleu3atQYMGSqXyxo0bwmtC2xUTE1O5cuXo6OgDBw507tzZuKtDhw5Hjx4dM2bMihUreIUnxhju3cOFC3j0CIxBpQJj2vT0ZFfXIr6+qFMHKhWA+Pj4KlWqPH36dPv27cJrQjno2LHjn3/+OXr06FWrVhm3m0szW3TgwIGuXbu6uroGBwcLu0wIYmJivL29Y2JisqYZN6Gh2LsXaWnQanPz5S+Sk9VKpWuBAqa7HRzg5obu3eHhYckgc4HySl55ZSw8HEFBCAnBy5dQq6FQrLt0adgff5QtUuTOmDFObm7w8kKtWqhQwWqPUHkuhFFRUZUrV46Lizt8+LAwzm7QsmXLf/75Z/z48UuXLrVokHwsX7583LhxlSpVCgoKcnR0NLTfunVL2ED1ypUrwoQ0zmJisGMHYmKQnm6i18EBGg169ICX14QJE/z9/Zs2bXr69GkFj4f0rPbs2dOjRw83N7fg4GBhLrsgmzSzUe+///7hw4dHjBgh7DtosGzZsvHjx2dNMw50Ohw8iKCgXJbAoKiogbt3P3j5UqvT+Xh4bO/Tp5Szs+kv1WjQogWaNrVktNmivJJRXhkwhtu3cfw4kpKQkQG93tBz/dkzv8OHRzRo0K9mzVdNjo5Qq9GqFerVs0I5zHMhHDJkyM8//9y1a9d9+/YZt2/fvr1fv37FixcPDg4WXhPauoyMjDp16ty8eXPJkiUTJkww7ho1atTq1avbtGlz/PhxXuG98uABfv8dWi2y/3fUaB5UqVKlf/+MjIxLly7VrVvXWvFlJz09vWbNmiEhIatWrRo9erRxl7k0s1137typXbu2TqcLCAgQXtMKskkzq9JqsWkTnj5FRkYuv6PT5s0tKlSY3LRpWkZGx82bK7i6buzRw+xXazSoUQMffGCFmxrlFeSTVwbx8di+Hc+fIz0djJlMA8aY+AFdo4GLC/r1g9HnXSnkrRBevXq1QYMGwmvYypUrG9pTUlKqV6/+4MGDtWvXDhs2TII4+Th+/Hi7du2cnZ2Dg4M9jMZ2DAOne/fuFTat4OPZM6xfj/T0ZefPfx8QUMbF5djAgQ4qlaE/WauttXr1u2XKbOnVCxrNLkfH6wkJ+XgrLJHvvvtu6tSp1atXv3btmvEglbk0s3Xjxo1bvny5r6/vqVOnjH/gzaWZ9TCGX3/F48dCFey5bVvg06e9qldf1K6d8VcdCQ0ddfDgpKZNRzRoAECn1ysVCuEPsuLChZ+vXr3+xReGL672/fd7PvywitGnMWg0aNAA7dtL/aehvBLwzyuDyEhs2tRz48bc5JVg7JEjnq6ufsK7TwcH9O0LLy/pAlTm6avHjh2r1+v9/PxEabR48eIHDx7UqVNn8ODBFg2Ps7Zt23bu3DkhIUFYPmzg7u4utIwfPz4tLY1PcDodfv9dGA6NTU29Hxt76uHDpefOGX+JnrH7sbGRCQkAoNX2TEv7ZswYLsFm9ezZswULFgDw9/cXvaoxl2a2btasWcWLFz9z5syuXbuM282lmfWcP4/wcMNnwYj4+PuxsUvPnbsQHm78VUnp6fdjY2NTUoT/VSmVhtvuo7i48kWKGH9xfFqaTvSQrdXi0iWEhUn0hxBQXhnwzytBdDQ2bkRqai7zSpCi1ab9Nz8L6enYtg2PH0sXYx4K4datW0+dOlWiRInp06cbt0dERCxatAjA8uXLVUYfR94Oy5cvd3R0/Pnnny9dumTcPnLkyJo1a967d09YscvBpUtITjZuKOrkNPfUqfuxsWa/RafDn39KHljuTJ06NT4+vlu3bh06dDBuN5dmbwFXV9c5c+YAGD9+fHLmfztzaWYNaWn4+2/Re0G1Uuns6Djq4EGd0Yscc54kJGy4dm1kw4YAHr58ueLChRUXLiRptZuvX19x4cKJ+/dff6lWiwMHLP0HyITyyriLZ14J9Hps2WKYvpCbvPo+IGDFhQtBUVFnHz1aceHCusuXAUCrxdatkOxTR24LYUpKinCI87ffflsk86PflClTkpKS+vTpI+yA95apVKnSqFGj9Hq9sEDV0K5Wq5cvXw5g7ty5kZGRHCI7d05085rq65uq1Y4+dMjst+j1uH8fiYmSx5aTK1eubNy40cHBQXiEMjCk2fz580Vp9nYYOnSoj4/Po0ePli1bZtxuLs2s4ebNrG1qpXJy06ZXIiO/DwjI/rtjU1K6btnSv1atTt7eAHSMJWm1SVotYyxFq00yfq7Hf8t7IiIs+gd4jfJKRnklCAxEQoJhBkNu8iopPT1Jq9Xq9ek6XZJWm2y4y2m1OHtWojBzWwg/+eSThw8f1q1bVzgv0eD8+fNbtmwpUKCAKPPeJrNmzfLw8Dh79qywfZFBmzZtunbtmpCQIOyPZ1UxMUhJEU2QaVCq1AAfn8MhITtv3TL7jUolQkIkDy9ber2+d+/eer1+3LhxokGqhQsXCmn26aefcopOWiqVSrhVzZ8//9GjR8Zd5tJMciEhJqeJjm/SpIKr64yTJ8Pj4819663nz5v8/HOTsmVXduoktFR0c5vWrNm0Zs0KOzgMrV9/WrNm73t7v/4GhQIZGRKNjlJeQVZ5JTh/XpRdOebVFF/fac2a1fXwaOXpOa1ZMz/DEkmtFv/+m8OswPxS5+aLAgIChNHnyZMnGw9+Gh40Jk2aJJyS9VZycXGZPXv28OHDJ06c2KVLF+N19MuWLTt69Ogvv/zSs2dPYU2FlQQHIzERaWkqpdKjcGFD83dt2+6+c8fv8OH2Xl4uJudMp6cjPBxcZ42OGTMmLCxMrVYLD+kG4eHhwmYZb+UYu0GrVq169er1xx9/fP3115s2bTK0G9JswoQJ9erVK1iwoJUCevAA/92SnDQat/+uW0CtXty+fZ/t28ceObKzb9+s37f95s0h+/aNbNhwWP36YS9fAvB0dc15WY5ej7g4S8b/H8oreeUV8OqhR6/PU15lR69HTAyKFrV4pLkqhMKnvXfeeefDDz80bo+MjIyPjy9duvSUKVMsHpmsDB48eM2aNS9evLh3757x2kEvL69BgwZt2LCB16rVEoUKPZs0yfC/JZ2dZ7VoMfHo0ZknTy43t0zK/AO+dQhPph9++KFomc2NGzc0Gk2/fv2aN2/OKTQrWbx48cGDB8PCwtLS0ozXeA0ePHjRokVRUVHexp+irGiAj88moyUQvatX7+Tt/cetWweCg7tkmWAy7cSJ4k5OO27e3PHf4OrdL79U/1cII7KZsi/NMnbKq7cjrwRru3Y10apUIi6OWyFUKpUAEhMT9Xq98N+C0qVLX79+PTQ0tFChQhaPTFZUKtXOnTtLliyZdVu1qKio9PR0FxeXwkafzCSn1SI1FUDxLH/zfo0bbwwM/D4g4NM6dSq5u5v4Xt5L6YUPDaIBHACdOnUKDg7OyPU6Ntvl6ekZEBBQs2ZN0eenlJSUhISE5OTk4sWLW2/Tk7Q0w1wG9ywfF5Z37PhXWNiYw4fbZtlQLTR/M5AdHCTaZYbySl55BUCvR3IyGMtTXuVAms/0uSqEK1eu3LVrV1JS0ooVK8aNG2fcpdFoqlWrJkVkcuNlahXL2bNn9+7dW7BgwRs3bgjnSVrJ3bvYs0eohSJqpXJ1587N168ffejQ4Y8/FncrFFI8T+XJ7NmzR4wYcebMmbCwME9PT+Ou4hIvm5UPk3sSLViwICoqqn79+gEBAcZPnNIKD8emTeZ2k6lctOik996bd+qU//nzVSySOXo9pPlcQnkFWeUVAL0e8+fDeLbUf/KZV1qtRLevXP2leHh4CAeaL126NFEGcw5lQliTxBibOnWqVasggNKls9kBxLdcuYF16px99GjX7dviPgcHlC0rbWw5GT58eJs2bfR6/dSpU/lGIithYWH+/v4KhWL58uVWvVuVKYPixbMZJ5jWrJmnm9uC06efvvnPvlqN2rUhzWsqyiuTuOUVAKUS5cub68xPXhUpAmkG3nL79zJr1qxGjRpFREQsXLhQijhs0bp16y5fvly2bFkOOxgVLpz9k9Gidu3cChaccfKkuEOnQ6VKEgaWOxs2bChUqNC2bdv++ecf3rHIxcSJE1NTUwcMGODr62vta/foAbXZwaGCGs3KTp0S09MXvvnkdUdHSXeWobzKimdeAWje3Nwr4TznlYMDJHvLm9tCqFAoVqxYoVAolixZEibx3hA2IT4+XtirbOnSpXzOY2rZEg4O5jpLFCo0r3Xrx6LpeSoV6tTJ5ruspkyZMpMmTQIwduxYnamRE3tz8uTJXbt2FS5cWNgVxdqKFUPPntnMYelSufIHVaqI0ymvHBwwYACk3ACa8kqEc14BKF8e3t7mHrPykFcqFYoVQ+3aFg7vP3n4pNy4ceOPP/44NTV18uTJEkVjQ7755punT582bdq0d+/efCKoWhUeHtm8Oh7RoMG7ZcpkatJoWOvWkgeWO5MnT65QocK1a9d++eUX3rFwptPphGMjp06dWqpUKT5BVK2KXr2yeUha9f77hfL9CKVSwckJn38Oo3MBJUJ5ZSCLvALQvTvc3MzVQpN5JV77r1TCyQn9+0s30S9vB/O+++67a9euDQwMbNmy5Vu8cDBHoaGhn332GWNs165dPDOsctwdcPwAABQXSURBVGUEBiIjIyoxUaFQdK5c2XgSqUKhqOvhEZua2rB06ZYVKiQyNvPJk1Xr13/00UfcAjai0WhKliy5c+fOixcvDhs2rIC5A+3swNq1a9evX+/p6bl582a1+SFKyRUrhmrVEBYW9vRpqcKFe1WvbtxZpEABj8KFHdXq1p6eVY230s6RRoNy5TBoENzcLByw6atRXr0il7xSqVC7NsLCwh4/zjGv7sXEfL5375OEhPcMUxnUari54fPPJXo7KMjzMUxz586dOXOmj4/P5cuX3+LVqdnr3LnzoUOHhg0btnbtWs6hxMVhwwYkJmZ3eo5SCbU6pmPHyu3a8T8xI7MWLVqcOnVq4sSJixcv5h0LH7GxsZUrV37x4sXOnTt79erFOxyAMVy+jL/+gk5n8oTL+LQ0R5XKMTc3VgcHODmhUydYfZNryis55tXZs/jnHzBmch6p4Pj9++02bXJ2dAz+8ksPFxeoVKhfH23aZPMO2yLyXAhTU1OrVav24MGDH3/8cfjw4RKFJWfHjh1r3769i4vL3bt3OR9uItBqcewYrl4FIC6HSiVUKpQpg27dUKTIypUr/fz8vLy8bt68KZOzOq9evdqwYUOVSnX9+vUqVarwDoeDsWPHrlixolWrVn/99RfvWIzodAgKwvnziI6GQmFYXLHnzp0vDhwY16TJ5GxO2XV0REYGypVDkyaoVInLulXKK5nmVWIizp59dbMSDibMosuWLQeDg4c2aPDT11+jeXPrDCTkuRAC2LFjR9++fd3d3UNCQtxNLtl+exmOu1y6dOn48eN5h2MkIQGBgbh9GzExyMiAUhmu1yeXLFm5c2fDi5mMjIy6desGBQUtWrRoktF+NHwNHTr0f//7X5cuXfbv3887Fmu7ffu2j4+PXq+/fPmyVbfoy72EBISE4O5dREQgJeWvR4/a/O9/zo6Od/38Srq4AIBKBYUCej0yMlC4MMqVQ5UqqFQJvMckKa/km1d6PR48wP37ePDg/PXrdYsWLQBApYKjI4oUCVWpao4cqc3IuHjxYgOjEwqlxfKlZcuWAMaNG5e/b7dd/v7+ACpVqpSamso7luwcPXrUycmpWbNmer3euP348eMAnJ2dnzx5wis2kWfPngkHAhw+fJh3LNbWsWNHAF988QXvQHInLY1FRn7QujWAzz/4gF28yC5dYoGBLCSERUWxjAze8WVCeSX/vJoxY4ZCoZg3b56oXfiM0bRpU9HtSzr5LITXrl1TqVRqtTooKMiyAclZdHS08An44MGDvGPJQXx8vDBsu3XrVlFX165dAQwePJhLYCYJL3KqVauWnp7OOxbrET6puLq6Pn/+nHcseRAaGuro6KhUKi9evMg7lhxQXvGOJQenT59WKBROTk4PHz40bo+LixNuX9u2bbNOJPkshIyxYcOGAWjXrp0Fo5E54Z1o27ZteQeSKz/99BOAMmXKJCUlGbcbbmQBAQG8YhNJS0sTzs1Zvnw571isJC0tTXh3tWzZMt6x5JmwgKpJkyZWe2DPH8or+RMm8gwYMEDULsxDLFu2rOj2JZH8F8KoqChhl3f5fzyyCJv7EKzT6YQR9tmzZ4u6hBeEsrqR7du3D4Cbm5v8H2MtQviwUrVqVVv8sBIfH1+yZEkAv/32G+9YckB5JXMPHz50cnJSKBSnT582bjfcvubMmWOFMPJfCBljS5cutYkXZhZhi69Fz5w5o1AoChYs+ODBA+N2w43s999/5xVbVrbyYuPNGV5fHTp0iHcs+fTzzz8DKF26dGJiIu9YckB5JXPTp08HUL9+fZ1OZ9xuuH2JBk6l8EaFMD09XfgY7u/vb6mA5Ek46szd3T06Opp3LHnTt29fAP379xe1r1u3Thg4lc+N7NatWxqNRqVSBQYG8o5FWkOGDAHQpUsX3oHkn06na9SoEYCZM2fyjiUHlFcyl5SUJBxasHHjRlFXnz59AHz88cdSx/BGhZAxdvDgQQAuLi6RkZEWCUiGUlJShFNdfvzxR96x5NmjR4+EkYdTp04Zt+t0uoYNGwKYNWsWp9BMGDNmDIBWrVrxDkRCV69eValUGo3mzp07vGN5I+fOnRMe2MPCwnjHkgPKK5nbtGkTgHfeeScuLs643dzty+LetBAyxjp16gRg+PDhb/5bydPcuXMB1KhRQ6vV8o4lP2bOnAmgbt26opGHs2fPmhw45SgmJqZYsWIA/vjjD96xSKVFixYAJkyYwDsQCxC26+vXrx/vQHJAeSVzer2+adOmAKZNmybqmjFjBoB69eqJbl+WZYFCGBIS4uDgoFQqL1269Oa/m9yEh4cLR88fPXqUdyz5lJycLIw8rF+/XtTVr1+/nt7eEWPGcAnMpB9++AGAp6dnSkoK71gsb+vWrQBKlCgRGxvLOxYLePz4caFChQD8/fffvGPJAeWVzF26dEmpVDo4OISEhBi3JyYmlilTZlHjxkmbN0t3dQsUQsaYcGy9Ndc/Ws0nn3wCoHfv3rwDeSObN28WRh5evnxp3P7y4UPm7MwUCpZ5yhZHGRkZtWvXBvDtt9/yjsXCkpOTha3qf/rpJ96xWIywa3+dOnUyZLagXoTySv4GDBgAoFevXqL2uG3bGMBKlmTx8RJd2jKF0LD+cceOHRb5DWXi/PnzCoXC0dFR9JBic/R6fbNmzQBMmTJF3DdrFgNY3bpMypGHPBF2RyxcuHBERATvWCxp9uzZNlEz8iQ5Obl17dpBzZvr1q3jHUsOKK9kLjIy0sXFxcTwm17PfH0ZwL76SqJLW6YQMsZ+/PFHa65/tAK9Xv/uu+8CmD59Ou9YLCAgIECpVDo6Oobfu5epIzmZlS/PAPa//3EKzYQePXoAGDRoEO9ALCY8PNxWRhHzSr91KwNYiRIs83iDDFFeydy3334L4N169cQ79l2+zJRK5uDAgoOluK7FCqFOp6tfvz6AuXPnWur35GvDhg3CSqmEhATesVjGEj+/yEaNWLdu4o4tW+R2I7t3716BAgUUCsWFCxd4x2IZ/fv3B9C3b1/egUijRQsGMNnP1KC8krmUlJSFnTqlVqzI1qwR9336KQNY9+5SXNdihZCZ3zjOFiUkJAgn7m7atIl3LJbz9ClzcWEAO3JE3NW8OQPYpEk8wjJt6tSpABo3bvwWvHi2oZUG+XT1KlOpmIMDk/3cfcorudu5kwHM3Z29eJGp3XD7+vNPi1/TkoWQMda7d28An3zyiWV/W+t7m35aMlmwgAGsenUm2oHpypVXIw9373KKTOyteRaxobXnb2TIEAYw2a/mpryyAe3aMYCNHStunz//1e3L0ivZLFwIDesfT8tmFmI+3L9//y0bP3ktLY15ezOArVol7ho8mAGsa1ceYZn2doxOr1+/3lZ2I3sjz56xIkUYwGS/vxflldwFBTG1mqnV7MaNTO2G29f331v2ghYuhMz8xnE2pGfPngAGDhzIOxBp7N7NAObmxkTbEBtuZLI5v02v1wvPvF9//TXvWPLJhvantoDFixnAqlYVjzfIDOWVDRgxggEs61E/u3a9un2JBk7fjOULoWHjuA0bNlj8N7eCt3WOdSYdOjCAjR4tbl+4kAGsWjX53MiEFSwFChS4f/8+71jyY8qUKXI76ENCaWmsShUGMNkfe0R5JXfR0axoUQaw/fvFXe3bM4B9+aUFr2b5QsjMbxwnf2/xqttMbt5kajVTqdj165na09JY5coMYCtWcIrMBNvd0+DevXu2coatxezfb3q8QX4or+Ru2TIGMC8vJjrdSLh9qdXi29cbkKQQ6vV6X19fAFOnTpXi95fO270PUyajRjGAtW4tbt+7V243Mtvd5a5bt24APvvsM96BWFfHjgxgsj/2iPJK7rRaVrMmA9jixeKukSMZwNq0sdSlJCmEzGjjuGBp1j9KwR525n0tJubVyMOePeKu9u2ZQsGyHInCkS3ue37ixAkAzs7OT5484R2Ldd26xTQaplKxa9d4h5IDyiu5O3aMAczZmYlON3rxgrm5MWdnJtoeJL+kKoSMsYEDBwLo2bOndJewLD8/v7f+rJZMVq5kAKtYUTzycOcOk9mQS0pKirCboq2chJWRkVGrVi0A3333He9YePDzYwCT/Y8S5ZUN6NyZAWzoUHH7sWPMco8CEhbCp0+fChvH/SnB+keLM5zeeU32j7EWk5HBatViAFu4kHcoOdu+fbsNnY28atUqABUrVnz7x9hNiolhxYqxJk2Y7A9DoLySu5AQ5ujIlEr277/SXUTBGINk5s+fP3369OrVqwcGBqrValHvZ599dvToUemublKNGjVMXrRTp05Hjhz54osvVq9ebeWQeDpxAm3bwtkZd++iZEne0eSgVatWf//997hx4/z9/bP2VqxYMS0tzcohjR49Wth7wVhsbGzlypVfvHixe/fu7t27WzkkuQgNhZcXFAreceSM8kruJk7E0qV47z2cOSNVRklXYxljaWlp3t7eAH744YesvV27dpXkj5QtHx+frJHs27cPgJub23PZzBCxng8+YL16sfDw1y0pKezAATZnDpsyhc2Zw/bvZ8nJ/OJ77dq1ayqVSq1WBwUFZe11cHCwfjqZOM2DsdGjRwNonXUi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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "id": "fc3667db",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.223176Z",
     "start_time": "2025-05-05T16:56:06.222003Z"
    }
   },
   "source": [],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "d50bf255",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-05T16:56:06.228233Z",
     "start_time": "2025-05-05T16:56:06.227131Z"
    }
   },
   "source": [],
   "outputs": [],
   "execution_count": null
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
